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

如何选择每个类别中最新的四个项目?

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

如何选择每个类别中最新的四个项目?

这是每组最大的问题,也是一个非常常见的SQL问题。

这是我通过外部联接解决的方法:

SELECt i1.*FROM item i1LEFT OUTER JOIN item i2  ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id)GROUP BY i1.item_idHAVINg COUNT(*) < 4ORDER BY category_id, date_listed;

我假设

item
表的主键是
item_id
,并且它是单调递增的伪键。也就是说,中的较大值
item_id
对应于中的新行
item

它是这样工作的:对于每个项目,还有一些其他较新的项目。例如,有三个项目比第四个最新项目新。有零个项目比最新的项目新。因此,我们想将每个项目(

i1
)与
i2
较新的项目集()进行比较,并具有与相同的类别
i1
。如果这些较新的项目的数量少于四个,
i1
则是我们包括的项目之一。否则,请勿将其包括在内。

该解决方案的优点在于,无论您有多少个类别,它都可以工作,并且如果您更改类别,它可以继续工作。即使某些类别中的项目数少于四个,它也可以工作。


另一个可行但依赖于MySQL用户变量功能的解决方案:

SELECt *FROM (    SELECt i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id    FROM (@g:=null, @r:=0) AS _init    CROSS JOIN item i    ORDER BY i.category_id, i.date_listed) AS tWHERe t.rownum <= 3;

MySQL 8.0.3引入了对SQL标准窗口函数的支持。现在,我们可以像其他RDBMS一样解决此类问题:

WITH numbered_item AS (  SELECt *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id) AS rownum  FROM item)SELECt * FROM numbered_item WHERe rownum <= 4;


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

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

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