我正在使用 Laravel 构建一个项目,并且我有一个包含我所有产品的表。在该表上,产品每天都会添加,并且我会在页面上显示按 created_at
排序的所有产品。使用 Laravel Eloquent 和 ->orderBy('created_at', 'DESC')
可以轻松完成这项工作。
但是,我希望能够将某些产品“固定”/“固定”到某个位置。为此,我创建了 rank_index
列,其中包含产品在返回的查询集合中应具有的编号。
这是我当前的表格:
title rank_index created_at An awesome product 2023-01-01 10:04:00 Another product 4 2023-01-01 10:00:00 Baby car 2023-01-01 10:05:00 Green carpet 2 2023-01-01 10:08:00 Toy 2023-01-01 10:07:00
下表显示了我希望查询返回的集合:
title rank_index created_at Toy 2023-01-01 10:07:00 Green carpet 2 2023-01-01 10:08:00 Baby car 2023-01-01 10:05:00 Another product 4 2023-01-01 10:00:00 An awesome product 2023-01-01 10:04:00
我希望有一个解决方案,可以直接从数据库返回这样的表。这样我就不必对集合进行分割和切片,这使得请求速度慢得多!否则,我必须使用 PHP 函数重新排列、分割和切片集合。
我很高兴能得到任何帮助!
亲切的问候
我几乎肯定会选择银的解决方案
您的声明:
没有什么意义。将两个结果集拆分/切片/拼接在一起不太可能对性能产生可衡量的影响。它肯定不会使“请求变慢”!
这是针对您的场景的 SQL 解决方案,但几乎肯定会比将两个结果集拼接在一起要慢,具体取决于所涉及的表的大小。
如果你有超过 1000 个玩具,递归 cte 将达到默认值cte_max_recursion_depth,如此处解释。
您可以在上述查询之前运行以下命令来删除限制:
或更改递归 CTE到非递归 CTE,其中toys 表上的“nofollow noreferrer">ROW_NUMBER():
这是一个可以玩的dbfiddle。
我今年就遇到过,直接在查询中排序比较复杂,可以参考这个问题MySQL 结果集按固定位置排序如果你想深入了解它的复杂性。
我之前做的比较简单,通过两个查询完成,
这是一个您可以参考的示例