MySQL双组

时间:2016-06-19 06:13:11

标签: mysql

我正在进行查询以从包含客户订单的数据库中提取数据。有一个表保存客户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失效。一直试图解决这个问题,所以任何帮助将不胜感激。请注意,这是实际问题的一个非常简化的版本,其中涉及更多的表,包括多个项目表连接在一起。

2 个答案:

答案 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