Построение SQL для вычисления количества строк, относящихся к родителю - PullRequest
1 голос
/ 13 июля 2011

Мне сложно построить SQL на следующей схеме базы данных,

Магазин

idимя

Заказ

idshop_idДатасумма

Вы видите, что в магазине может быть много заказов.Я хотел бы построить SQL, который дает количество заказов каждого магазина на конкретную дату.Так что часть WHERE должна быть (например, 2011-7-13),

WHERE order.date = '2011-7-13'

Я не могу думать о том, как часть SELECT должнабыть как.Я думаю, что COUNT (*) должен быть использован, но это все, что у меня сейчас в голове.

Может кто-нибудь дать несколько советов по этому поводу?

Большое спасибо всем вам.

Ответы [ 4 ]

2 голосов
/ 13 июля 2011

Попробуйте это:

SELECT a.id, a.name, COUNT(1) AS order_count
  FROM Shop a INNER JOIN Order b
    ON a.id = b.shop_id
 WHERE `date` = '2011-7-13'
 GROUP BY a.id, a.name
1 голос
/ 13 июля 2011

После некоторого рассмотрения (и заслуженного замечания @ AJ) вот мой (исправленный) ответ.

SELECT shop.id, shop.name,
FROM shop
JOIN (SELECT shop_id, date, COUNT(*)
      FROM order
      WHERE date = :date
      GROUP BY shop_id, date) as order_count
ON order_count.shop_id = shop.id

Если вы хотите получить список всех заказов по дате, удалите внутреннее предложение WHERE.

1 голос
/ 13 июля 2011
SELECT Shop.name, COUNT(*) AS Num_Orders
FROM Shop JOIN `Order` ON Shop.id = `Order`.id
WHERE DATE(`Order`.`date`) = '2011-7-13'
GROUP BY `Order`.id;

Обратите внимание, в случае, если date - это столбец DATETIME, я использовал функцию DATE(), чтобы вернуть только часть даты, а не время.

Возможно, вам придется заключать в кавычки date и Order, как указано выше, поскольку они являются зарезервированными ключевыми словами MySQL. Может быть, не date, но почти наверняка Order.

1 голос
/ 13 июля 2011

попробуйте это:

SELECT COUNT(Order.id), Shop.name, Order.date
FROM Shop INNER JOIN Order ON Shop.id=Order.shop_id
WHERE Order.date = '$date'
GROUP BY Shop.name, Order.date
ORDER BY Order.date

Я включил дату в результаты проверки.

...