【问题标题】:How can I use COUNT and GROUP BY in MYSQL while still displaying all individual rows?如何在 MYSQL 中使用 COUNT 和 GROUP BY 同时仍显示所有单独的行?
【发布时间】:2019-10-08 11:01:56
【问题描述】:

我只是在尝试使用 MYSQL 进行一些练习。我有一个数据集,我想在其中获取订购了两种或多种不同商品的客户的姓名以及他们购买了每种商品的数量。

下面的查询为每个购买者的姓名提供了一行。但是,我还想显示他们购买了哪些类型的商品以及购买了多少。理想情况下,我希望每个客户购买的不同商品数量相同。

SELECT firstname, familyname, description, quantity
FROM customers c
JOIN orders o ON o.custID = c.custID
JOIN lineitems l on o.orderID = l.orderID
JOIN items i on l.itemID = i.itemID
GROUP BY firstname
HAVING count(description) 

下面的查询确实为我提供了每件商品的一行、该人购买了多少商品以及购买者的姓名。但是,它不再过滤仅购买一件特定商品的客户。

SELECT firstname, familyname, description, quantity
FROM customers c
JOIN orders o ON o.custID = c.custID
JOIN lineitems l on o.orderID = l.orderID
JOIN items i on l.itemID = i.itemID
WHERE EXISTS(
    SELECT *
    FROM customers
    GROUP BY firstname
    HAVING count(description) >= 2)

基本上,我想结合这两种方法,其中每个客户的特定商品有多行,同时还过滤掉只购买一种商品的客户。

【问题讨论】:

  • 您使用的是哪个版本的 MySQL?请添加一些示例数据和预期输出。

标签: mysql group-by count


【解决方案1】:

如果您运行的是 MySQL 8.0,您可以在子查询中进行窗口计数并在外部查询中进行过滤,例如:

SELECT *
FROM (
    SELECT 
        c.firstname, 
        c.familyname, 
        i.description, 
        l.quantity, 
        COUNT(*) OVER(PARTITION BY c.custID) cnt
    FROM customers c
    JOIN orders o ON o.custID = c.custID
    JOIN lineitems l on o.orderID = l.orderID
    JOIN items i on l.itemID = i.itemID
) x
WHERE cnt > 1

注意:最好在列名前加上它们所属表的别名;这使查询更具可读性并避免跨表存在相同列名时发生冲突。我做了一些假设并相应地更新了查询。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2019-07-07
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多