栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

这个问题留下了解释的余地​​。要

UNIOn
产生的所有三个查询的行,然后挑选5行最高“金额”:

(SELECt event_id, count(*) AS amountFROM   pageview GROUP  BY event_idORDER  BY pageviews DESC, rand()LIMIT  1000)UNIOn ALL(SELECt event_id, count(*)FROM   upvoteGROUP  BY event_idORDER  BY upvotes DESC, rand()LIMIT  1000)UNIOn ALL(SELECt event_id, count(*)FROM   attendingGROUP  BY event_idORDER  BY attendants DESC, rand()LIMIT  1000)ORDER  BY 2 DESCLIMIT  5;

手册:

要适用于

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

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


如果要 为每个添加计数

event_id
,则此查询应这样做:

SELECT event_id, sum(amount) AS totalFROM (   (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)    ) xGROUP  BY 1ORDER  BY sum(amount) DESCLIMIT  5;

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

NULL

使用

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

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

SOL功能

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

回答跟进问题

SELECt event_id, sum(amount) AS totalFROM (   (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 ... )    ) xGROUP  BY 1ORDER  BY  sum(amount) DESCLIMIT  5;

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

SELECt event_id      ,sum(CASE source   WHEN 'p' THEN amount / 100   WHEN 'u' THEN amount * 5   WHEN 'a' THEN amount * 10   ELSE 0END)  AS totalFROM (   (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 ... )    ) xGROUP  BY 1ORDER  BY 2 DESCLIMIT  5;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号