我正在进行查询以从包含客户订单的数据库中提取数据。有一个表保存客户ID和客户名称。另一个表具有订单ID,下订单的客户ID,购买的商品数量和商品ID。最后一个表包含项目ID和项目名称。我试图对这些进行排序以显示个人最受欢迎的购买,但是如果正确分组和订购产生正确结果的问题,下面是一个例子。
customers
1 | John
---+-----
2 | Jane
orders
1 | 2 | 4 | 1
---+---+---+---
2 | 2 | 5 | 2
---+---+---+---
3 | 2 | 2 | 1
---+---+---+---
4 | 1 | 1 | 2
items
1 | Chair
---+-------
2 | Sofa
正确排序和分组后,输出表应如下:
John | Sofa
------+------
Jane | Chair
目前我可以将商品名称连接到购买者并返回已购买的随机商品,但不是最受欢迎的数量。我已经尝试将多个字段输入group by
并设法按名称对项目进行正确分组并按数量排序,但这样做会导致客户ID失效。一直试图解决这个问题,所以任何帮助将不胜感激。请注意,这是实际问题的一个非常简化的版本,其中涉及更多的表,包括多个项目表连接在一起。
答案 0 :(得分:0)
您应该在连接表上使用group by
select
b.name
, c.name
, sum(quantity) as tot
from orders as a
inner join Customers as b on a.customer_id = b.id
inner join Items as c on a.item_id = c.id
group by b.name, c.name
order by tot
答案 1 :(得分:0)
选择每个客户项目组的数量总和很容易,但选择最畅销的商品会有点困难。
第一步是查询以获取每个客户项目的数量总和的所有组:
SELECT
customer_name,item_name,SUM(quantity)
FROM
orders o
JOIN customers c ON o.customer_id=c.id
JOIN items i ON o.item_id=i.id
GROUP BY customer_name,item_name;
然后,为了只选择具有最大数量总和的组,我们使用了一些技巧:
SELECT
customer_name,item_name,SUM(quantity),
(SELECT SUM(quantity) AS qmax
FROM
orders o2
JOIN customers c2 ON o2.customer_id=c2.id
JOIN items i2 ON o2.item_id=i2.id
WHERE c2.id=c.id
GROUP BY c2.customer_name,i2.item_name
ORDER BY qmax DESC LIMIT 1) AS qmax
FROM
orders o
JOIN customers c ON o.customer_id=c.id
JOIN items i ON o.item_id=i.id
GROUP BY customer_name,item_name
HAVING SUM(quantity)=qmax;
修改强> 这是一个小提琴的链接:SQLFiddle