【问题标题】:SQL Query to find the value which has max number of occurrences in a table without nestingSQL查询查找表中出现次数最多的值而不嵌套
【发布时间】:2014-01-31 23:28:07
【问题描述】:

我正在研究以下架构(粗体文本代表 pk,“:”代表引用的表):

USERS(用户名、姓名、姓氏);

产品(id、名称、数量);

PURCHASES(user:USERS, product:PRODUCTS, dateAndTime, quantityPurchased);

我想查找购买次数最多的用户的姓名。

首先,我使用嵌套查询来找出每个用户的购买次数,然后选择购买的用户 >= 所有这些值:

SELECT name, surname, username
FROM users JOIN purchases ON username = user
GROUP BY name, surname, username
HAVING count(*) >= ALL(
    SELECT count(*)
    FROM utenti JOIN acquisti ON username = user
    GROUP BY username)

有没有其他方法可以在不使用嵌套查询的情况下达到同样的效果?

提前感谢您的宝贵时间。

【问题讨论】:

    标签: sql nested max find-occurrences


    【解决方案1】:

    是的,有。这听起来像是一项家庭作业,但您似乎已经投入了一些工作。这个想法是通过count(*) 订购并占据第一行。 SQL Server、Sybase 和 Access 中的语法是:

    SELECT top 1 name, surname, username
    FROM users as u INNER JOIN
         purchases as p
         ON u.username = p.user
    GROUP BY name, surname, username
    ORDER BY count(*) desc;
    

    其他数据库会在order by 之后放置一个limit 1 子句,而不是top 1。其他的可能有更神秘的语法。

    【讨论】:

    • 非常感谢 :) 这只是我从我的 DB 类的旧测试中作为“培训”进行的练习。我只是对其他方法感到好奇。
    【解决方案2】:

    这将返回用户购买最多的商品。

    SELECT TOP 1
       U.name, U.surname, SUM(P.quantityPurchased) Purchases
    FROM users U
      JOIN purchases P
        on U.username= P.user
    GROUP BY U.username, U.name, U.surname
    ORDER BY Purchases DESC
    

    这将返回购买最多的用户。

    SELECT TOP 1
       U.name, U.surname, COUNT(*) occurrences
    FROM users U
      JOIN purchases P
        on U.username= P.user
    GROUP BY U.username, U.name, U.surname
    ORDER BY occurrences DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2011-04-29
      • 2020-07-22
      • 2011-06-05
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多