优化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中文网其他相关文章!