Получение количества строк с помощью запроса GROUP BY

У меня есть вопрос о влиянии

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, но я думаю, что это довольно общий вариант.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
58
1
93 157
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Модификатор запроса SQL_CALC_FOUND_ROWS и соответствующая функция FOUND_ROWS () устарели с MySQL 8.0.17 и будут удалены в будущей версии MySQL. dev.mysql.com/doc/refman/8.0/en/…

Mrskman 28.05.2019 13:26

Спасибо, хороший совет. Я ответил на этот вопрос в 2008 году и с тех пор видел тесты, которые показывают, что SQL_CALC_FOUND_ROWS вызывает проблемы с производительностью. Иногда (в зависимости от того, сколько данных вы сканируете) вам лучше запустить запросы два, один для COUNT(*), а второй для выполнения запроса с LIMIT, а не с SQL_CALC_FOUND_ROWS.

Bill Karwin 28.05.2019 19:02
Ответ принят как подходящий

В 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

С заявлением об отказе от ответственности, что я сам не тестировал звонки, эта статья отключила меня от решения: mysqlperformanceblog.com/2007/08/28/…

Brendan Berg 20.04.2010 03:20

Вместо выполнения нескольких запросов, пожалуйста, stackoverflow.com/a/364838/631652 для ответа Тома.

Parixit 19.09.2013 17:29

Модификатор запроса SQL_CALC_FOUND_ROWS и соответствующая функция FOUND_ROWS () устарели с MySQL 8.0.17 и будут удалены в будущей версии MySQL. dev.mysql.com/doc/refman/8.0/en/…

Mrskman 28.05.2019 13:25

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

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

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

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

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

В MySQL это будет ошибкой, но это может быть нормальным решением, если вы добавите псевдоним для сгенерированной таблицы. В противном случае вы получите ошибку: «Каждая производная таблица должна иметь собственный псевдоним». Поэтому обязательно напишите что-нибудь вроде: select count (*) from (your query) as resultTable

Kennethvr 31.08.2010 15:44

первый вариант у меня отлично сработал! Спасибо, приятель

isabelle martz 31.01.2017 00:59

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

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

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

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

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

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

Другие вопросы по теме