当前位置: 首页 > 面试题库 >

求和一些查询的结果,然后在SQL中找到前5名

邓卓
2023-03-14
问题内容

我有3个查询:

table: pageview
SELECT event_id, count(*) AS pageviews 
FROM pageview 
GROUP BY event_id
ORDER BY pageviews DESC, rand()
LIMIT 1000

table: upvote
SELECT event_id, count(*) AS upvotes 
FROM upvote
GROUP BY event_id
ORDER BY upvotes DESC, rand()
LIMIT 1000

table: attending
SELECT event_id, count(*) AS attendants
FROM attending
GROUP BY event_id
ORDER BY attendants DESC, rand()
LIMIT 1000

我想event_id按数量组合所有3个查询的,然后选择前5个。我该怎么做?

编辑:这就是我要发生的事情:

SELECT event_id, sum(amount) AS total
FROM (
(SELECT event_id, count(*) AS amount
FROM   pageview 
GROUP  BY event_id
ORDER  BY amount DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*) as amount
FROM   upvote
GROUP  BY event_id
ORDER  BY amount DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*) as amount
FROM   attending
GROUP  BY event_id
ORDER  BY amount DESC, rand()
LIMIT  1000)
) x
GROUP  BY 1
ORDER  BY  sum(amount) DESC
LIMIT  5;

问题答案:

这个问题留下了解释的余地​​。要UNION产生的所有三个查询的行,然后挑选5行最高“金额”:

(SELECT event_id, count(*) AS amount
FROM   pageview 
GROUP  BY event_id
ORDER  BY pageviews DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*)
FROM   upvote
GROUP  BY event_id
ORDER  BY upvotes DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*)
FROM   attending
GROUP  BY event_id
ORDER  BY attendants DESC, rand()
LIMIT  1000)

ORDER  BY 2 DESC
LIMIT  5;

手册:

要适用于ORDER BY或适用LIMIT于个人SELECT,请将条款放在括号内SELECT

UNION ALL,因此不会删除重复项。

如果要 为每个添加计数event_id,则此查询应这样做:

SELECT event_id, sum(amount) AS total
FROM (
   (SELECT event_id, count(*) AS amount
    FROM   pageview 
    GROUP  BY event_id
    ORDER  BY pageviews DESC, rand()
    LIMIT  1000)

    UNION ALL
    (SELECT event_id, count(*)
    FROM   upvote
    GROUP  BY event_id
    ORDER  BY upvotes DESC, rand()
    LIMIT  1000)

    UNION ALL
    (SELECT event_id, count(*)
    FROM   attending
    GROUP  BY event_id
    ORDER  BY attendants DESC, rand()
    LIMIT  1000)
    ) x
GROUP  BY 1
ORDER  BY sum(amount) DESC
LIMIT  5;

这里的棘手部分是,并非所有event_id都将出现在所有三个基本查询中。所以你必须注意JOIN不会完全丢失行并且添加不会出现NULL

使用UNION ALL,而不是UNION。您不想删除相同的行,而是要添加它们。

x是速记AS x-表别名。子查询必须具有名称。在这里可以是任何其他名称。

SOL功能FULL OUTER JOIN未在MySQL中实现(我上次查看),因此您必须使用UNION。FULL OUTER JOIN将联接所有三个基本查询而不会丢失行。

回答跟进问题

SELECT event_id, sum(amount) AS total
FROM (
   (SELECT event_id, count(*) / 100 AS amount
    FROM   pageview ... )

    UNION ALL
    (SELECT event_id, count(*) * 5 
    FROM   upvote ... )

    UNION ALL
    (SELECT event_id, count(*) * 10
    FROM   attending ... )
    ) x
GROUP  BY 1
ORDER  BY  sum(amount) DESC
LIMIT  5;

或者,如果您想以多种方式使用基本计数:

SELECT event_id
      ,sum(CASE source
              WHEN 'p' THEN amount / 100
              WHEN 'u' THEN amount * 5
              WHEN 'a' THEN amount * 10
              ELSE 0
           END)  AS total
FROM (
   (SELECT event_id, 'p'::text AS source, count(*) AS amount
    FROM   pageview ... )

    UNION ALL
    (SELECT event_id, 'u'::text, count(*)
    FROM   upvote ... )

    UNION ALL
    (SELECT event_id, 'a'::text, count(*)
    FROM   attending ... )
    ) x
GROUP  BY 1
ORDER  BY 2 DESC
LIMIT  5;


 类似资料:
  • 我正在CodeIgniter上开发一个测验应用程序。 随机从数据库中挑选25个问题并显示给用户。 以下是我的代码: 我想在一个div上显示前10个结果。 当用户单击下一个按钮时,它会显示下一个10个结果。 (隐藏当前div并显示下一个) 我只想知道我如何打破结果,并限制每个分区10个问题。

  • 背景:我有一个目录,其中包含许多导入SQL服务器的文件。 任务:创建PowerShell脚本,该脚本将拾取此目录中的文件,并使用SQL查询中的文件名。 最终目标:除了显示文件名之外,显示SQL结果,但显示的结果集也应该显示服务器中没有条目SQL文件。类似于SQL服务器查询中的。 Powershell代码 到目前为止完成的工作:我已经能够使用Get-ChildItem获取文件名并循环它们以获取查询结

  • 问题内容: 我非常确定我们不能将LIMIT子句用于我想做的事情-因此想确定是否还有其他方法可以实现此目的。 我有一个表,其中捕获了哪个用户访问了哪个商店。每次用户访问商店时,都会在此表中插入一行。 一些领域是 shopping_id(primary key) store_id user_id 现在,我想要的是-对于给定的一组商店,找到访问该商店的最大次数的前5位用户。 我可以一次在1个商店中进行以

  • 问题内容: 我正在尝试从sql数据库中的php中显示结果,MySQL语句是正确的,并且可以在phpMyAdmin中执行我想要的操作,但是由于某种原因,我的代码在网页中中断了 这是代码 这就是我得到的 通常,我需要由表ID限制从最小值到最大值的随机数 问题答案: 您需要从查询获得的结果集中的每一行中获取数据。您可以为此使用。 将代码更改为此:

  • 问题内容: 我正在用SSRS编写一份报告。该数据集填充有MS SQL Server的SQL查询。它使用Union All查询几个相似的表。问题是有一些信息丢失。不同的表适用于不同的工作站点,但是这些表中的任何列都没有站点名称。标识站点的唯一方法是通过表名。在“全部合并”的结果的合并列中,无法分辨出哪些行来自哪个站点。 有没有一种方法可以更改我的查询以在结果中添加一列,该列将具有与每一行相关联的工作

  • 问题内容: 我想为sql查询的结果中的每一行生成一个行号。如何做到这一点? 例如:在请求 我想添加一列以显示行号 我正在使用sql server 2005。 问题答案: 这取决于您使用的数据库。一种适用于SQL Server,Oracle和MySQL的选项: 更改SomeField和SomeTable是根据您的特定表和相关字段进行排序的。自然,优选SomeField在查询上下文中是唯一的。 在您的