MySQL - Використання COUNT (*) у пункті WHERE


157

Я намагаюся виконати наступне в MySQL (див. pseudoКод)

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

Чи є спосіб це зробити без використання (SELECT ...) у пункті WHERE, оскільки це може здатися марною тратою ресурсів.

Відповіді:


264

спробуйте це;

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

37
+1 за те, що це завжди застереження про те, що вони не намагаються навчати належним чином на курсах або книгах sql, і знаючи про це, як правило, знак того, що кодер просунувся за межі початкового рівня.
Круачан

Що робити, якщо ви намагаєтесь використовувати COUNT () як частину булевого АБО виразу? наприклад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 у будь-якому випадку для чистого синтаксису (це може бути моє налаштування, або мс ... ах, добре).
Саміс

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

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

EDIT (якщо ви просто хочете діток):

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.