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 ответа:
вам нужно использовать наличие, а не где.
разница заключается в следующем: предложение 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
но есть по крайней мере 2sid
s. чтобы убедиться, что вы получите обратно только одну строку вpid
я применил группировку пункт.