SQL-запрос для группировки данных из двух таблиц - PullRequest
3 голосов
/ 24 октября 2010

У меня есть 3 таблицы:

  • Пользователи (идентификатор, имя)
  • Заказы (id, userId)
  • Orders_Items (id, orderId, status)

Сначала я хотел перечислить всех пользователей с их соответствующим количеством заказов следующим образом:

  • А, 1 заказ
  • B, 5 заказов

Это просто, я делаю "выбрать имя, количество (id) пользователей, заказы, где users.id = orders.userId group by name".

Теперь я хотел бы дополнительно отфильтровать эти данные, чтобы показывать только пользователей с заказами, у которых есть элементы со статусом = "необработанный". Я не уверен, как идти о группировании данных из 2 таблиц. В конце я ищу данные вроде:

  • (не показан, нет заказа с любым элементом, имеющим статус = необработанный)
  • B, 3 заказа (2 заказа не имеют товара со статусом = необработанный).

Спасибо!

Ответы [ 2 ]

1 голос
/ 24 октября 2010

Использование:

  SELECT u.name,
         COUNT(o.id) AS numOrders
    FROM USERS u
    JOIN ORDERS o ON o.userid = u.id
   WHERE EXISTS(SELECT NULL 
                  FROM ORDERS_ITEMS oi 
                 WHERE oi.orderid = o.id
                   AND oi.status = 'unprocessed')
GROUP BY u.name 

Использование JOIN для ORDERS_ITEMS потребует использования DISTINCT в COUNT:

  SELECT u.name,
         COUNT(DISTINCT o.id) AS numOrders
    FROM USERS u
    JOIN ORDERS o ON o.userid = u.id
    JOIN ORDERS_ITEMS oi ON oi.orderid = o.id
                        AND oi.status = 'unprocessed'
GROUP BY u.name 

... из-за дублирования строк, когда в заказе более одного необработанного элемента ...

0 голосов
/ 24 октября 2010
select name, count(users.id) from users 
left join orders 
on users.id=orders.userId 
left join orders_items 
on orders.id=orders_items.orderId 
where orders_items.status="unprocessed"

Я сейчас проверяю это, не совсем уверен, правильно ли я это понял. Изменить: кажется, хорошо.

...