[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: неверный pagination запрос mysql.
mad/crs
Знающие ткните пожалуста каки образом подсчитать кол.во записей с таким фильтром:

SELECT COUNT(i.*) FROM items AS i,categories AS c WHERE i.category=$category OR (c.id=i.category AND c.pid=$category) GROUP BY i.id

конструкция - COUNT(i.*) неверная, это я знаю но чем её заменить?! unsure.gif
смысл запроса:
таблицы: items - список товаров(поле category содержит id записи в таблице категорий к которой относится товар),
category - список категорий( поле pid содержит id родительской категории или 0)
задача: для пагинатора надо получить кол.во товаров в выбранной категории($category).

P.S. дайте ссылку на хороший учебник по mysql который можно читать оффлаин(читаю в PDA). Заранее спасиб smile.gif



Спустя 16 минут, 50 секунд (5.04.2010 - 10:59) sergeiss написал(а):
А кто тебе мешает просто написать COUNT(*)?

Спустя 11 минут, 38 секунд (5.04.2010 - 11:11) mad/crs написал(а):
если просто COUNT(*) то в ответ приходит общее ко.во записей а не записей соответствующих фильтру.

Спустя 55 секунд (5.04.2010 - 11:12) glock18 написал(а):
убрать group by при подсчете. если будет слишком большой каунт, то можно считать count(distinct i.id) - будет то же самое, только каунт будет правильный.

Спустя 6 часов, 52 минуты, 37 секунд (5.04.2010 - 18:04) vagrand написал(а):
Юзай SQL_CALC_FOUND_ROWS и found_rows() - это самый верный вариант

Спустя 1 час, 1 минута, 11 секунд (5.04.2010 - 19:05) glock18 написал(а):
Цитата (vagrand @ 5.04.2010 - 15:04)
Юзай SQL_CALC_FOUND_ROWS и found_rows() - это самый верный вариант


ну прямо самый верный. если считать таким образом, то mysql проходит по всей таблице независимо от лимита и индексов.

Спустя 3 часа, 30 минут, 32 секунды (5.04.2010 - 22:36) Nikitian написал(а):
Цитата (glock18 @ 5.04.2010 - 16:05)
Цитата (vagrand @ 5.04.2010 - 15:04)
Юзай SQL_CALC_FOUND_ROWS и found_rows() - это самый верный вариант


ну прямо самый верный. если считать таким образом, то mysql проходит по всей таблице независимо от лимита и индексов.

Индексы всё-таки используются, если они используются и в оригинальном запросе, а вот лимиты - да, на больших таблицах проблема. Я так вообще обычными каунтами, но у меня все запросы в мемкеше плавают и пока не протухнут помогают снижать нагрузку. Ну и explain каждого запроса - просто обязательно.

Спустя 46 минут, 15 секунд (5.04.2010 - 23:22) mad/crs написал(а):
Работает на 5+! biggrin.gif Спасибо glock18 ! Одно только гложет... почему же не работает через COUN(i.id)/COUNT(i.*)... интересно поподробнее понять механизм таких вот "извращений". smile.gif

SELECT COUNT(DISTINCT i.id) AS total FROM items AS i,categories AS c WHERE i.category=36 OR (c.id=i.category AND c.pid=36)

А кто может посоветовать хороший справочник(скачиваемый но не .chm) по MySQL что бы в предь незадавать глупых вопросов? smile.gif

Спустя 8 часов, 3 минуты, 15 секунд (6.04.2010 - 07:25) glock18 написал(а):
Не знаю насчет скачиваемости, но лучший определенно этот - http://dev.mysql.com/doc/refman/5.1/en/
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.