MySQL объединяет проблему - PullRequest
       7

MySQL объединяет проблему

0 голосов
/ 21 февраля 2011

Я создаю простой магазин, но столкнулся с простой проблемой ..

У меня есть две таблицы, одна называется shop, а другая shop_orders. shop имеет ширину продуктов, а id, shop_orders имеет product_id, к которой он привязан к таблице shop и amount элементов в этом порядке.

Я хочу отфильтровать элементы в таблице shop по наиболее продаваемым позициям, поэтому я хочу отсортировать таблицу shop по сумме amount с shop_orders.product_id = shop.id.

У меня следующий запрос:

   SELECT shop.*, 
          SUM(shop_orders.amount) as sold 
     FROM shop
LEFT JOIN shop_orders ON (shop_orders.product_id = shop.id)

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

Я пытался использовать:

   SELECT shop.*, 
          SUM(shop_orders.amount) as sold 
     FROM shop
LEFT JOIN shop_orders ON (shop_orders.product_id = shop.id)
    WHERE shop_orders.product_id IS NULL

Ведьма возвращает все предметы, которые еще не были проданы. Но если я попытаюсь использовать:

   SELECT shop.*, 
          SUM(shop_orders.amount) as sold
     FROM shop
LEFT JOIN shop_orders ON (shop_orders.product_id = shop.id)
    WHERE (shop_orders.product_id IS NULL || shop_order.product_id NOT IS NULL)

ничего не возвращает. Как я могу заставить этот запрос работать так, чтобы все элементы в таблице shop возвращались со строкой под названием sold, ведьма подсчитывает это shop_order.amount для этого product_id вместе, чтобы я мог отсортировать по этому.

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Ваш первый пример выглядит как правильное направление, но, честно говоря, я немного удивлен, что это сработало вообще, потому что, как указал Scrum Meister, у вас нет предложения group by и у вас есть функция итога. Также, если вы хотите упорядочить результаты, вам нужно добавить порядок по пунктам, он должен выглядеть следующим образом.

SELECT shop.*, SUM(shop_orders.amount) as sold
FROM shop LEFT JOIN shop_orders on (shop_orders.product_id = shop.id)
GROUP BY shop.* -- this should not be shop.* but shop.column for each column in shop    
ORDER BY SUM(shop_orders.amount) DESC

Это должно возвращать каждую запись в первой таблице shop и только записи из второй таблицы shop_orders, которые соответствуют записи в shop. Он также упорядочит результаты на основе наиболее упорядоченных в первую очередь. Возможно, вы захотите добавить CASE-статут или другой условный оператор, чтобы преобразовать значения NULL в проданном столбце в 0.

1 голос
/ 21 февраля 2011

Похоже, что отсутствует пункт GROUP BY, следующий запрос должен работать, возвращая общую сумму продажи, или NULL для продуктов, которые не были проданы.

SELECT shop.*, SUM(shop_orders.amount) as sold 
FROM shop LEFT JOIN shop_orders ON (shop_orders.product_id = shop.id)
GROUP BY shop.id
...