Mysql возвращает только одну строку при использовании Count - PullRequest
8 голосов
/ 03 ноября 2010

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

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

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

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

Проблема в ...

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

Ответы [ 3 ]

13 голосов
/ 03 ноября 2010

Да, 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.

9 голосов
/ 03 ноября 2010

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

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

3 голосов
/ 03 ноября 2010

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

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