Получение количества строк с группой по запросу
у меня есть запрос на эффект
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 ответов:
есть хорошее решение в 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.