Mysql возвращает только одну строку при использовании Count

Ну, я только что столкнулся со странным поведением, которого никогда раньше не видел или не замечал.

Я использую этот запрос:

  SELECT *, 
         COUNT(*) AS pages 
    FROM notis 
   WHERE cid = 20 
ORDER BY nid DESC 
   LIMIT 0, 3

... чтобы прочитать 3 элемента, но при этом я хочу получить общее количество строк.

Проблема в том, что...

... когда я использую count, запрос возвращает только одну строку, но если я удаляю COUNT(*) AS pages -- я получаю 3 строки, как и предполагал. Очевидно, я что-то здесь упускаю.


person Breezer    schedule 02.11.2010    source источник
comment
Вам нужно что-то вроде оконных функций, которые, к сожалению, не поддерживаются MySQL. Вам нужно будет сделать два отдельных запроса.   -  person Pablo Santa Cruz    schedule 03.11.2010
comment
Даже в этом случае данные не связаны друг с другом. То, что он на самом деле просит, похоже на то, что для первых трех человек в отделе 20 дайте мне их имя и фамилию, а также общее количество людей в отделе 20. Да, вы можете спрашивать об этом, но это не имеет смысла. спросить об этом, потому что вы получите общее количество людей в отделе 20 три раза.   -  person McKay    schedule 03.11.2010
comment
ну, это действительно настолько глупый вопрос, я имею в виду, что мне кажется довольно логичным, что вы спрашиваете всех людей в отделе и получаете информацию о 3 первых, кто переехал   -  person Breezer    schedule 03.11.2010
comment
@Breezer, затем попросите об этом: выберите count (*) from notis, где cid = 20; выберите * из notis, где cid=20 ограничение 0,3   -  person McKay    schedule 03.11.2010
comment
@Breezer, вы запрашиваете две разные части данных. Запрашивайте их по отдельности, не пытайтесь объединить их в один запрос, если это не имеет смысла.   -  person McKay    schedule 03.11.2010
comment
да, я понял это сейчас, но я надеялся, что мне не нужно будет делать 2 запроса к базе данных   -  person Breezer    schedule 03.11.2010


Ответы (3)


Да, count - это агрегатный оператор, который возвращает только одну строку (без предложения group by)

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

Если вы действительно этого хотите, вы можете сделать что-то вроде этого:

SELECT *, (select count(*) FROM notis WHERE cid=20) AS count FROM notis WHERE cid=20 ORDER BY nid DESC LIMIT 0,3

или это:

SELECT N.*, C.total from notis N join (select count(*) total FROM notis WHERE cid=20) C WHERE cid=20) AS count FROM notis WHERE cid=20 ORDER BY nid DESC LIMIT 0,3

С отклонениями во вложенном выражении в зависимости от вашего диалекта SQL.

person McKay    schedule 02.11.2010
comment
да, это, кажется, крайняя мера, сделать два звонка, спасибо - person Breezer; 03.11.2010

Использование агрегатной функции без GROUP BY всегда будет возвращать одну строку, несмотря ни на что. Вы должны использовать GROUP BY, если хотите вернуть более одной строки.

Обратите внимание, что в большинстве СУБД такой запрос не удался бы, потому что он не имеет смысла.

person Vincent Savard    schedule 02.11.2010
comment
но если я использую группу по счету, функция возвращает 1 в качестве результата - person Breezer; 03.11.2010
comment
Да, как сказал Пабло Санта-Крус, вам нужно будет использовать оконную функцию, но она не поддерживается MySQL. Вам нужно будет сделать 2 запроса. - person Vincent Savard; 03.11.2010

Это неэффективно, но будет работать:

SELECT 
   *,
   (SELECT COUNT(*) FROM notis WHERE cid=20) AS pages
FROM notis 
WHERE cid=20 
ORDER BY nid DESC 
LIMIT 0,3
person Hamish    schedule 02.11.2010