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


Вы используете 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/…
Спасибо, хороший совет. Я ответил на этот вопрос в 2008 году и с тех пор видел тесты, которые показывают, что SQL_CALC_FOUND_ROWS вызывает проблемы с производительностью. Иногда (в зависимости от того, сколько данных вы сканируете) вам лучше запустить запросы два, один для COUNT(*), а второй для выполнения запроса с LIMIT, а не с SQL_CALC_FOUND_ROWS.
В 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/…
Вместо выполнения нескольких запросов, пожалуйста, stackoverflow.com/a/364838/631652 для ответа Тома.
Модификатор запроса SQL_CALC_FOUND_ROWS и соответствующая функция FOUND_ROWS () устарели с MySQL 8.0.17 и будут удалены в будущей версии MySQL. dev.mysql.com/doc/refman/8.0/en/…
"Куча прочего" - это все агрегаты? Я предполагаю, что так, поскольку ваша 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
первый вариант у меня отлично сработал! Спасибо, приятель
Использование подзапросов:
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
Это найдет счет при вычислении группы по.