Как подсчитать все строки при использовании SELECT с LIMIT в запросе MySQL?

17

У меня есть запрос mysql:

SELECT A.ID, A.NAME, B.ID, B.NAME
FROM table1 A
JOIN table2 B ON ( A.ID = B.TABLE1_ID )
WHERE
    cond1, cond2, ..., condN
LIMIT 10

У меня есть много предложений о предложениях. Как улучшить этот запрос, чтобы получить также полный счетчик строк? Я не хочу использовать еще один запрос без LIMIT.

    
задан SaltLake 13.03.2010 в 21:00
источник

5 ответов

33

Что вы ищете, р>

SELECT SQL_CALC_FOUND_ROWS A.ID, A.NAME, B.ID, B.NAME
FROM table1 A
JOIN table2 B ON ( A.ID = B.TABLE1_ID )
WHERE
  cond1, cond2, ..., condN
LIMIT 10

SELECT FOUND_ROWS();
    
ответ дан Shuriken 13.03.2010 в 21:15
  • Спасибо! Это отлично работает в мониторе mysql. Но в PHP второй запрос возвращает 1. Как правильно выполнить эти два запроса в PHP? –  SaltLake 13.03.2010 в 21:43
  • Какую версию PHP вы установили? Взгляните на этот stackoverflow.com/questions/674061/... –  Shuriken 13.03.2010 в 21:50
7

Вы можете использовать SQL_CALC_FOUND_ROWS с FOUND_ROWS () для подсчета количества результатов во время выполнения этого запроса. В основном вы просто добавляете «SQL_CALC_FOUND_ROWS» после «SELECT», а затем запускаете еще один запрос «SELECT FOUND_ROWS ()». Невозможно отправить счетчик в том же запросе, потому что он не может знать счетчик до завершения запроса.

    
ответ дан animuson 13.03.2010 в 21:12
5

'это 4 года с момента последнего ответа, но именно так я решил проблему. Хотя ответ SaltLake дал мне ошибку, это привело меня к правильному ответу.

SELECT SQL_CALC_FOUND_ROWS * FROM wholedatabase LIMIT 0,10 UNION 
SELECT 'TotalRows', FOUND_ROWS(), NULL, NULL, NULL, NULL
ORDER BY IssueDate, VolumeNo 

Часть UNION очень важна, потому что она отправляет ваш желаемый ответ (общее количество строк), который извлекается в результате SECOND Select, на результаты FIRST Select.

Еще один очень важный момент состоит в том, что, поскольку UNION имеет место, обе таблицы должны иметь одинаковое количество столбцов в них. Обычно это означает, что вам нужно вставить SECOND Select с помощью важного значения FOUND_ROWS (), а затем много значений NULL.

Конечным результатом будет одна команда, которая вернет 11 строк информации, причем одна из этих строк содержит общее количество строк. Очевидно, вам нужно будет исключить дополнительную строку TotalRows, когда вы приступите к использованию результата.     

ответ дан Alan N 12.06.2014 в 03:02
0

Решение Ссылка

SELECT SQL_CALC_FOUND_ROWS 
    '0', z.id
FROM 
    zoom AS z 
LIMIT 0,6 
UNION 
  SELECT 
    '1', FOUND_ROWS() 
ORDER BY '0' DESC , RAND()
    
ответ дан SaltLake 13.03.2010 в 23:01
-1

Вы должны использовать

SELECT SQL_CALC_FOUND_ROWS A.ID, A.NAME, B.ID, B.NAME, FOUND_ROWS() as rCount
FROM table1 A
JOIN table2 B ON ( A.ID = B.TABLE1_ID )
WHERE
    cond1, cond2, ..., condN
LIMIT 10
    
ответ дан Krishna 08.07.2016 в 09:28