MySQL - использование COUNT (*) в предложении WHERE


157

Я пытаюсь сделать следующее в MySQL (см. pseudoКод)

SELECT DISTINCT gid
FROM `gd`
WHERE COUNT(*) > 10
ORDER BY lastupdated DESC

Есть ли способ сделать это без использования (SELECT ...) в предложении WHERE, потому что это может показаться пустой тратой ресурсов.

Ответы:


265

попробуй это;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc

37
+1 для того, чтобы иметь Это всегда пункт, который Они не удосуживаются преподавать должным образом на курсах или книгах sql и зная об этом, как правило, признак того, что кодер продвинулся выше уровня новичка.
Cruachan

Что, если вы пытаетесь использовать COUNT () как часть логического выражения OR? например,AND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby

Я понял это .. Вы можете добавить к предложению HAVING, например, так:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby

28

Я не уверен, что вы пытаетесь сделать ... может быть, что-то вроде

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC

1
MSSQL выдает ошибку синтаксического анализа "недопустимое имя столбца"num . +1 в любом случае для чистого синтаксиса (может быть, мои настройки, или мс ... ааа хорошо).
Самис

Укажите псевдоним для всех столбцов в списке выбора.
Адиль Халил

18
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

РЕДАКТИРОВАТЬ (если вы просто хотите, чтобы уроки):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC

Спасибо Джо, но это возвращает COUNT () - я ищу, чтобы вернуть все гиды, которые имеют COUNT (*) более 10

1
Там нет необходимости Min () там.
Али Эрсез

14

пытаться

SELECT DISTINCT gid
FROM `gd`
group by gid
having count(*) > 10
ORDER BY max(lastupdated) DESC

14

Просто академическая версия без оговорок:

select *
from (
   select gid, count(*) as tmpcount from gd group by gid
) as tmp
where tmpcount > 10;

13

В предложении WHERE не может быть агрегатных функций (например, COUNT, MAX и т. Д.). Следовательно, вместо этого мы используем предложение HAVING. Поэтому весь запрос будет похож на это:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;

6

- поиск метеостанций с отсутствующими получасовыми записями

SELECT stationid
FROM weather_data 
WHERE  `Timestamp` LIKE '2011-11-15 %'  AND 
stationid IN (SELECT `ID` FROM `weather_stations`)
GROUP BY stationid 
HAVING COUNT(*) != 48;

- вариация япискана с помощью где .. в .. выберите


1

Я думаю, вы не можете добавить count()с where. теперь понятно почему ....

whereэто не то же самое having, что havingозначает, что вы работаете или имеете дело с группой и выполняете одинаковую работу, это также касается всей группы,

Теперь, как рассчитывать это работает как целая группа

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

select count(*) from table_name

Вы найдете общие значения означает, что это указывает на какую-то группу! так whereже добавил с count();


1

COUNT (*) может использоваться только с HAVING и должен использоваться после оператора GROUP BY. Найдите следующий пример:

SELECT COUNT(*), M_Director.PID FROM Movie
INNER JOIN M_Director ON Movie.MID = M_Director.MID 
GROUP BY M_Director.PID
HAVING COUNT(*) > 10
ORDER BY COUNT(*) ASC
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.