COUNT в запросе с несколькими JOINS и GROUP BY CLAUSE - PullRequest
2 голосов
/ 11 мая 2009

Я работаю над базой данных, которая содержит 3 таблицы:

  1. Список компаний
  2. Таблица продуктов, которые они продают
  3. Таблица цен, которые они предлагали на каждую дату

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

SELECT
  a.name AS company,
  c.id,
  MIN(c.price) AS apy
FROM `companies` a
JOIN `company_products` b ON b.company_id = a.id
JOIN `product_prices` c ON c.product_id = b.id
WHERE
  b.type = "%s"
  AND c.date = "%s"
GROUP BY a.id
ORDER BY c.price ASC
LIMIT %d, %d

Это дает мне данные, которые мне нужны, но для реализации пейджера на PHP мне нужно знать, сколько всего компаний предлагают этот продукт в тот день. ПРЕДЕЛ означает, что я вижу только первые несколько ...

Я попытался изменить предложение SELECT на SELECT COUNT (a.id) или SELECT COUNT (DISTINCT (a.id)), но ни один из них, похоже, не дает мне того, что я хочу. Я попытался удалить GROUP BY и ORDER BY в моем запросе счета, но это тоже не сработало. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 11 мая 2009

Этот веб-сайт предполагает, что в MySQL для этого есть специальный прием, по крайней мере начиная с версии 4:

К счастью, начиная с MySQL 4.0.0, вы можете использовать опцию SQL_CALC_FOUND_ROWS в своем запросе, которая скажет MySQL подсчитать общее количество строк без учета предложения LIMIT. Вам все еще нужно выполнить второй запрос, чтобы получить количество строк, но это простой запрос, не такой сложный, как ваш запрос, который извлек данные.

Использование довольно просто. В ваш основной запрос вам нужно добавить опцию SQL_CALC_FOUND_ROWS сразу после SELECT, а во втором запросе вам нужно использовать функцию FOUND_ROWS (), чтобы получить общее количество строк. Запросы выглядят так:

SELECT SQL_CALC_FOUND_ROWS name, email 
FROM users 
WHERE name LIKE 'a%' 
LIMIT 10;

SELECT FOUND_ROWS();

Единственным ограничением является то, что вы должны вызывать второй запрос сразу после первого, потому что SQL_CALC_FOUND_ROWS нигде не сохраняет количество строк.

3 голосов
/ 11 мая 2009

Похоже, вы должны GROUP BY a.id, c.id - группировка по a.id означает лишь, что у вас обычно есть несколько c.id с на a.id, и вы просто получаете случайное значение одного из их. Это кажется вопросом основной правильности. После того, как вы это исправите, начальные значения SELECT COUNT(*) FROM и т. Д. Должны определенно дать вам количество строк, которые будет возвращать следующий запрос, чтобы вы могли соответствующим образом подготовить свой пейджер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...