Получение количества строк с помощью запроса GROUP BY - PullRequest
57 голосов
/ 13 декабря 2008

У меня есть запрос на эффект

SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20

Я хочу знать, во сколько всего строк этот запрос будет возвращен без LIMIT (чтобы я мог показать информацию о нумерации страниц).

Обычно я бы использовал этот запрос:

SELECT COUNT(t3.id) FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id

Однако GROUP BY меняет значение COUNT, и вместо этого я получаю набор строк, представляющих количество уникальных значений t3.id в каждой группе.

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

Ответы [ 5 ]

53 голосов
/ 13 декабря 2008

В MySQL есть хорошее решение.

Добавьте ключевое слово SQL_CALC_FOUND_ROWS сразу после ключевого слова SELECT:

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20

После этого выполните другой запрос с функцией FOUND_ROWS ():

SELECT FOUND_ROWS();

Он должен возвращать количество строк без предложения LIMIT.

Закажите эту страницу для получения дополнительной информации: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

50 голосов
/ 13 декабря 2008

Являются ли "куча других вещей" совокупностями? Я полагаю, так как в вашей GROUP BY есть только t3.id. Если это так, то это должно работать:

SELECT
     COUNT(DISTINCT t3.id)
FROM...

Другой вариант, конечно, это:

SELECT
     COUNT(*)
FROM
     (
     <Your query here>
     ) AS SQ

Я не использую MySQL, поэтому я не знаю, будут ли работать эти запросы там или нет.

12 голосов
/ 10 мая 2012

Использование подзапросов:

SELECT COUNT(*) FROM    
(
SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
)    
as temp;

, поэтому temp содержит количество строк.

11 голосов
/ 13 декабря 2008

Вы используете MySQL, так что вы можете использовать их функцию, чтобы сделать именно это.

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff 
FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20;

SELECT FOUND_ROWS(); -- for most recent query

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

1 голос
/ 06 апреля 2016

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

Лучший способ найти счетчик по группе ниже

SELECT 
    sum(1) as counttotal
FROM (
    Your query with group by operator
) as T

Это будет число при расчете группы по.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...