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

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

蒯安平
2023-03-14
问题内容

我有一个项目数据库。每个项目都按类别表中的类别ID进行分类。我正在尝试创建一个列出每个类别的页面,并在每个类别下方显示该类别中的4个最新项目。

例如:

宠物用品

img1
img2
img3
img4

宠物食品

img1
img2
img3
img4

我知道我可以通过查询数据库来轻松解决此问题,如下所示:

选择类别的ID

然后遍历该数据并查询数据库中的每个类别以获取最新的项目:

从项目中选择图像,其中category_id =:category_id 
ORDER BY date_listed DESC LIMIT 4

我要弄清楚的是,我是否可以仅使用1个查询并获取所有这些数据。我有33个类别,因此我认为这可能有助于减少对数据库的调用次数。

有人知道这是否可能吗?或者,如果33个电话没什么大不了的,那么我应该以简单的方式进行。


问题答案:

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

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

SELECT i1.*
FROM item i1
LEFT OUTER JOIN item i2
  ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id)
GROUP BY i1.item_id
HAVING COUNT(*) < 4
ORDER 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 t
WHERE 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;


 类似资料:
  • 问题内容: 我的数据如下所示: 我要完成的工作是按类别获取最新的2个条目(按insertdate DESC的顺序排列),因此结果应为: 使用获取最新消息很容易,但是如何在不启动多个查询的情况下获取最新2? 感谢您的帮助;-) S. 问题答案: 在这里,你哥们!

  • 问题内容: 假设我有一个会议实体。每个会议都有一个与会者和一个会议日期。在我的会议表中,我可能会为每个与会者召开多个会议,每个会议的日期都不同。我需要一个JPA查询,该查询将仅为所有与会者选择最新的会议。例如,如果我的桌子看起来像这样 我的结果应该是 针对postgres使用JPA 2。会议有1-1个出席者和一个简单的时间戳记日期。我怀疑我需要和max(blah)做一个小组,也许还需要加入我自己的

  • 问题内容: 可以说我有一张叫Gamers的桌子。 玩家 包含列,,。 我有兴趣选择每个游戏中得分最高的球员。 例如, 查询后,我希望获得GamerID 4、5和8的行。执行该操作的查询是什么? 问题答案: 试试这个: 这将输出: 您可以做的另一种选择是创建一个临时表或视图(如果您不喜欢子查询)。 然后: 或视图: 然后:

  • 问题内容: 我们是postgres的新手,我们有以下查询,通过该查询我们可以从每个类别中选择前N个记录。 以上查询的输出是这样的 但是我们的要求有所不同,我们想从每个类别中选择前n%个记录,其中n不固定,n基于每个组中某些元素的百分比。 问题答案: 要基于每个组中行数的百分比来检索行,可以使用两个窗口函数:一个对行进行计数,另一个对行赋予唯一编号。 SQLFiddle示例:http ://sqlf

  • 问题内容: 我经营一个网站,用户可以在其中发布项目(例如图片)。这些项目存储在MySQL数据库中。 我想查询最后十个发布项目,但任何单个用户最多只能约束3个项目。 最好的方法是什么?我的首选解决方案是对SQL查询施加约束,以请求最后十项。但是非常欢迎有关如何设置数据库设计的想法。 提前致谢! BR 问题答案: 使用关联的子查询非常容易: 该查询假定以后添加了较大的均值 相关子查询是一个强大的工具!

  • 问题内容: 我有这张表 language_id是指记录所用的语言。我想做的是检索 每个language_id中 最近的五个记录(ORDER BY time_posted DESC LIMIT 5)的列表。我可以使用许多不同的SQL查询在PHP中循环执行此操作,但我觉得有一种更简单的方法。 我必须得到一本有关SQL的书,哈哈。 谢谢。 问题答案: 这是我在MySQL中解决此“每组前N个”类型的查询的