2012-04-08 3 views
0

Я хотел бы подсчитать общее количество строк, возвращаемых по следующему запросу:Получить счет сложного запроса

SELECT table1.*, COUNT(table2.fk) * (100/18) AS 'number' 
FROM table1 INNER JOIN table2 ON table1.pk = table2.fk 
WHERE table1.Street LIKE '$Street%' 
AND table1.City LIKE '$City%' 
AND table1.Zip LIKE '%$Zip' 
AND table1.DOBY LIKE '%$DOBY' 
AND table1.DOBM LIKE '%$DOBM' 
AND table1.DOBD LIKE '%$DOBD' 
AND table1.Gender LIKE '$gender%' 
AND table2.year>= 2004 
AND table2.type IN ('AA', 'AB', 'AC') 
GROUP BY table2.fk 
HAVING (COUNT(table2.fk) * (100/18)) >= '$activity' 
ORDER BY DOBY, DOBM, DOBD ASC 

Запрос подсчитывает количество или раз первичный ключ table1 происходит в качестве внешнего ключа table2 , и вычисляет процент («число») на основе фиксированной суммы. Он работает достаточно хорошо, но мне трудно получить общее количество записей, найденных для моего сценария разбиения на страницы. Буду признателен, если кто-нибудь может предложить некоторые предложения или решения.

+0

Выполнение работы подзапроса (т. Е. '(SELECT COUNT (id) FROM table WHERE conditional = $ variable) AS count')? Или это вопрос, для чего вам нужен счет? Я не вижу ключевое слово 'LIMIT'. –

+0

Это запрос, для которого мне нужен счет. Это гораздо сложнее, но я немного изменил его для простоты. Ключевое слово limit появляется после последней строки: «LIMIT $ start, $ limit»; – deathonater

ответ

0

и может сделать SQL_CALC_FOUND_ROWS (Google для точного синтаксиса)
А затем использовать SELECT FOUND_ROWS() AS total

+0

Большое спасибо! Это немного медленная работа над очень большой базой данных, которую я использую, но сейчас она должна работать. – deathonater

+0

Если он очень большой, вы должны кэшировать счетчик. Никто не дает точные цифры (а не событие Google) в своих папках для действительно больших чисел. И еще одно: yuo использовать это ТОЛЬКО в первый раз, вы должны обязательно кэшировать его на небольшие промежутки времени. –

0

Отправляясь с тем, что говорит Итай Моав, язык программирования должен иметь функцию для функции found_rows. В соответствии с function documentation он возвращает число строк оператора SELECT с ключевым словом LIMIT, если ключевого слова LIMIT не было.

Если это не так, вы можете просто сделать еще один запрос SELECT к базе данных: SELECT FOUND_ROWS();. Он вернет ту же информацию.

 Смежные вопросы

  • Нет связанных вопросов^_^