MySQL: недопустимое использование функции группы


Я использую MySQL. Вот моя схема:

поставщики(sid: integer, sname: строка, адресная строка)

части(pid: integer, pname: string, color: string)

каталог(Сид: целое число, ID процесса: целое число, стоимость: реальный)

(первичные ключи выделены жирным шрифтом)

Я пытаюсь написать запрос, чтобы выбрать все детали, которые производятся не менее чем двумя поставщиками:

-- Find the pids of parts supplied by at least two different suppliers.
SELECT c1.pid                      -- select the pid
FROM Catalog AS c1                 -- from the Catalog table
WHERE c1.pid IN (                  -- where that pid is in the set:
    SELECT c2.pid                  -- of pids
    FROM Catalog AS c2             -- from catalog
    WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids
);

во-первых, я даже идешь по этому правильному пути?

во-вторых, я получаю эту ошибку:

1111 - недопустимое использование групповой функции

что я делаю не так?

2 76

2 ответа:

вам нужно использовать наличие, а не где.

разница заключается в следующем: предложение WHERE фильтрует строки, которые выбирает MySQL. затем MySQL группирует строки вместе и агрегирует числа для вашей функции подсчета.

иметь-это как где, только это происходит после значение счетчика было вычислено, так что он будет работать, как вы ожидаете. Перепишите свой подзапрос как:

(                  -- where that pid is in the set:
SELECT c2.pid                  -- of pids
FROM Catalog AS c2             -- from catalog
WHERE c2.pid = c1.pid
HAVING COUNT(c2.sid) >= 2)

во-первых, ошибку вы получаете из-за того, где вы используете COUNT функция -- вы не можете использовать агрегатные (или группы) функция WHERE предложения.

во-вторых, вместо того, чтобы использовать подзапрос, просто присоединиться к таблице:

SELECT a.pid 
FROM Catalog as a LEFT JOIN Catalog as b USING( pid )
WHERE a.sid != b.sid
GROUP BY a.pid

который я считаю, должен возвращать только строки, где по крайней мере две строки существуют с тем же pid но есть по крайней мере 2 sid s. чтобы убедиться, что вы получите обратно только одну строку в pid я применил группировку пункт.