首页 > 数据库 > mysql教程 > 如何使用单个 SQL 查询从多个类别中检索最新项目?

如何使用单个 SQL 查询从多个类别中检索最新项目?

Linda Hamilton
发布: 2025-01-22 02:06:12
原创
703 人浏览过

How Can I Retrieve the Newest Items from Multiple Categories Using a Single SQL Query?

用于从各个类别检索最新项目的单个 SQL 查询

本文介绍了高效的 SQL 解决方案,用于使用单个数据库查询检索多个类别中的最新项目,从而最大限度地减少数据库调用。

SQL 解决方案:利用外连接

使用外连接可以优雅地解决“每组最大n个”问题:

<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(i2.item_id) < 4;</code>
登录后复制

此查询有效地选择各自类别中少于四个新项目的项目。

说明:

查询将每个项目 (i1) 与同一类别中具有更高 i2 的其他项目 (item_id) 连接起来(意味着它们较新)。 HAVING 子句过滤掉具有三个或更多较新项目的项目,每个类别仅留下四个最新项目。

优点:

  • 可扩展性:有效处理任意数量的类别。
  • 稳健性:即使每个类别的项目数量不同或类别结构发生变化,也能正常工作。

替代方法:

  • MySQL 用户变量:

此方法使用 MySQL 的用户定义变量来分配行号并识别每个类别的四个最新项目。 (这种方法的可移植性不如外连接方法)。

  • 窗口函数(MySQL 8.0.3 及更高版本):

MySQL 8.0.3 支持标准 SQL 窗口函数,提供更简洁的解决方案:

<code class="language-sql">WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id DESC) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;</code>
登录后复制

此方法按类别对项目进行分区,根据 item_id 分配行号(按降序排列,最新的在前),然后从每个分区中选择前四行。

以上是如何使用单个 SQL 查询从多个类别中检索最新项目?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板