用于从各个类别检索最新项目的单个 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 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中文网其他相关文章!