如何在JOIN两张表时保留featured_products表的行顺序?
实现保留
featured_products行顺序的表关联 当然有办法实现,核心是给featured_products的原始行顺序做标记,关联后按这个标记排序即可,具体两种常见方案:
方案一:用窗口函数生成行号(适用于PostgreSQL、MySQL 8+、SQL Server等支持窗口函数的数据库)
通过ROW_NUMBER()窗口函数给featured_products的每一行按原始顺序分配行号,关联后按行号排序:
SELECT p.item_id, p.price FROM products p INNER JOIN ( SELECT item_id, ROW_NUMBER() OVER () AS row_num FROM featured_products ) f ON p.item_id = f.item_id ORDER BY f.row_num;
方案二:用变量生成行号(适用于MySQL 5.x等不支持窗口函数的老版本数据库)
通过用户变量手动累加生成行号,再关联排序:
SELECT p.item_id, p.price FROM products p INNER JOIN ( SELECT item_id, @row := @row + 1 AS row_num FROM featured_products, (SELECT @row := 0) AS init ) f ON p.item_id = f.item_id ORDER BY f.row_num;
补充说明
如果featured_products本身有天然排序字段(比如插入时间created_at、优先级字段sort_order),直接用该字段做ORDER BY会更稳妥;没有这类字段时,上述方法就能满足需求。
内容的提问来源于stack exchange,提问作者Joe Defill
相关产品推荐
相关产品推荐

