【发布时间】:2017-12-22 08:45:10
【问题描述】:
我在关系数据库中有一组表
productscategoriesordersline_itemscustomers
Products 与类别具有多对多关系(连接表categories_products),并且还拥有并属于许多orders 到line_items,这是products 和orders 的连接表一个身份证。一个customer 也有很多orders。
我正在尝试整理一些 SQL 来给我这样的响应:
customer_id | customer_first_name | category_id | category_name | number_purchased
-----------------------------------
1 |Jack | 1 | Electronics | 15
2 |Jill | 1 | Electronics | 2
2 |Jill | 2 | Hiking | 3
这是我一直试图用来获取这些值的大量 SQL:
SELECT
DISTINCT customers.id AS customer_id,
customers.first_name AS customer_first_name,
categories.id AS category_id,
categories.name AS category_name,
(
SELECT count(li.id) FROM line_items li
INNER JOIN orders o ON li.order_id = o.id
INNER JOIN products p ON li.product_id = p.id
INNER JOIN categories_products cp ON cp.product_id = p.id
WHERE
o.customer_id = customer_id
AND o.status = 3
AND cp.category_id = category_id
) AS number_purchased
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.id
LEFT JOIN line_items li ON li.order_id = orders.id
LEFT JOIN products ON products.id = li.product_id
LEFT JOIN categories_products catpr ON catpr.product_id = products.id
LEFT JOIN categories ON catpr.category_id = categories.id
只有计数本身是错误的。我不是获取客户在特定类别中购买的订单项的数量,而是获取已完成订单的所有订单项的计数。
如何让计数正确表示category 中特定customer 购买的line_items 数量?
注意:在 SQL 文本中,o.status = 3 使用枚举来指示订单“完成”。
【问题讨论】:
-
您的查询看起来像是特定于类别的。删除
number_purchased会返回类似的输出吗? -
我建议添加 group by's
-
@RudyM
number_purchased是唯一返回错误的值。理论上,我可以在单独的查询中为customer和category的每个组合或在代码级别获得number_purchased值,但我特意尝试编写单个SQL 语句来正确输出所有这些信息跨度> -
@PapaPoison ,所以对于 Jill,两行都得到 3?
-
@RudyM,不,我得到的是第一行,Jack 的所有行数为 15。
标签: mysql sql join subquery associations