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

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

Поставщики (sid: целое число, sname: строка, строка адреса)

Части (pid: целое число, pname: строка, цвет: строка)

Каталог (sid: целое число, pid: целое число, стоимость: реальный)

(первичные ключи являются полужирными),

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

-- 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 - Недопустимое использование функции группы

Что я делаю неправильно?

91
задан APerson 25 July 2016 в 05:35
поделиться

2 ответа

. Вам нужно использовать HAVING , а не ГДЕ .

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

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

(                  -- 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)
156
ответ дан 24 November 2019 в 06:47
поделиться

По крайней мере, последние версии Internet Explorer, Firefox, Chrome и Safari поддерживают события cut и paste , которые запускаются сразу после вырезания или вставки текста в заданный элемент ввода. События инициируются взаимодействиями клавиатуры и мыши . Прослушивание комбинации этих и других событий должно обеспечить нужную функциональность.

$("#foo").bind("keyup keydown change paste cut", handler);

Я протестировал это на Mac в Firefox 3.6, Chrome 5.0 (dev) и Safari 4, а также на Windows в Firefox 3.5 и IE8.

-121--3397696-

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

Теперь это звучит глупо, но рассмотрим некоторые случаи, когда это не так. Действительно ли меня волнует, что в @ _ здесь?

sub looks_like_a_number { $_[0] !~ /\D/ }
sub is_a_dog            { eval { $_[0]->DOES( 'Dog' ) } }

В этих двух примерах, если аргумент не тот, что вы ожидаете, вы все равно получите правильный ответ, потому что недействительные аргументы не пройдут тесты. Некоторые люди считают это безобразным, и я вижу их точку зрения, но я также считаю альтернативу безобразной. Кто побеждает?

Однако там будут временами, что вы должны охранять условия, потому что ваша ситуация не так проста. Следующее, что вы должны передать свои данные, чтобы можно было ожидать, что они находятся в определенных диапазонах или определенных типах и не проваливаются элегантно.

Когда я думаю о защитных условиях, я думаю о том, что может произойти, если входные данные плохи и насколько меня волнует сбой. Я должен судить об этом по требованиям каждой ситуации. Я знаю, что это отстой как ответ, но мне, как правило, нравится это лучше, чем подход кабалы и дисциплины, где вы должны пройти через весь беспорядок, даже когда это не имеет значения.

Я опасаюсь Params:: Validate , потому что его код часто длиннее, чем моя подпрограмма. Лось очень привлекателен, но вы должны понять, что это способ для вас заявить, что вы хотите, и вы все еще получаете то, что вы можете построить вручную (вы просто не должны видеть это или сделать это). Самое большое, что я ненавижу в Perl - это отсутствие необязательных сигнатур метода, и это одна из самых привлекательных функций в Perl 6, а также Moose.

-121--2262468-

Во-первых, ошибка связана с использованием функции 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 , я применил предложение группировки.

8
ответ дан 24 November 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: