Получение количества строк с группой по запросу


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

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

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

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

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

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

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

5 56

5 ответов:

есть хорошее решение в 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

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

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

другой вариант, конечно, является:

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

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

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

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 содержит количество строк.

вы используете 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

все заданные ans выполнят запрос, а затем найдут счетчик. Distinct определенно медленнее, чем group by на большом наборе данных.

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

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

Это позволит найти количество при вычислении group by.