首页 >数据库 >mysql教程 >如何在 SQL 中高效地选择每个类别的最新项目?

如何在 SQL 中高效地选择每个类别的最新项目?

DDD
DDD原创
2025-01-22 02:10:091019浏览

How Can I Efficiently Select the Latest Items per Category in SQL?

优化SQL查询,高效选择每个类别中的最新项目

数据库中展示每个类别最新项目的挑战,需要一个高效的SQL查询。虽然逐个类别迭代并查询最新项目是一种直接的方法,但最好能通过减少数据库调用来优化查询。

最大-N-每组问题

在类别组中识别最新n条记录的任务被称为最大-n-每组问题,这是一个常见的SQL查询问题。

外连接解决方案

使用外连接,我们可以获得所需的结果:

<code class="language-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;</code>

说明

此查询在每个项目 (i1) 与比它更新的项目 (i2) 之间执行外连接,只考虑同一类别中的项目。COUNT(*) 子句确定每个 i1 的较新项目的数量。少于四个较新项目的项目成为我们选择的合格候选者。

优势

此解决方案具有灵活性和适应性:

  • 可轻松处理任意数量的类别
  • 不会受类别修改的影响
  • 可处理项目数量不同的类别

替代方案

另一个使用用户变量的特定于MySQL的解决方案:

<code class="language-sql">SELECT *
FROM (
    SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id
    FROM (SELECT @g:=null, @r:=0) AS _init
    CROSS JOIN item i
    ORDER BY i.category_id, i.date_listed
) AS t
WHERE t.rownum <= 4;</code>

SQL窗口函数

MySQL 8.0.3 引入了窗口函数,允许使用另一种高效的解决方案:

<code class="language-sql">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;</code>

结论

通过根据您的特定 MySQL 版本和数据库结构选择合适的查询方法,您可以有效地优化每个类别中最新项目的选取。

以上是如何在 SQL 中高效地选择每个类别的最新项目?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn