例如我有一张 table :
| id | title | created_at |
1 12:00
2 13:00
2 14:00
1 15:00
我希望相同的 ID 号彼此靠近。在这种情况下,1 1 2 2 或 2 2 1 1 AND 按 created_at 时间对相同的 id block 进行排序,因此拥有最新 created_at 的 id block 保持在顶部,然后变为一个,与第三个 id block 相比具有最高的 created_at 等等在。我该怎么做?
orderBy('id', 'desc')->orderBy('created_at', 'desc')->get();
//将 id 排序到相同的 id block ,但它不会' 将具有最新 id chunk (1 1) created_at 的 block 排在顶部。
orderBy('created_at', 'desc')->orderBy('id', 'desc')->get();
//在顶部给出最新的 created_at 等等,但相同的 ID 彼此并不接近。
更大的例子:
| id | title | created_at |
1 12:00
2 13:00
1 15:00
2 15:00
1 17:00
3 18:00
1 19:00
3 20:00
想要实现 foreach($table_rows as $row) { } 会给我结果:
3 20:00
3 18:00
1 19:00
1 17:00
1 15:00
1 12:00
2 15:00
2 13:00
我知道单独使用mysql很难。我如何在 php 中以最简单的方式做到这一点?
我打赌我必须先按 id 排序,然后按最新的 created_at 将每个 id 的 block 相对于彼此推送。
最佳答案
您需要获取每个id的最近日期的信息。下面是一个使用 join
和聚合的方法:
select t.*
from table t join
(select t.id, max(created_at) as maxca
from table t
group by t.id
) tt
on t.id = tt.id
order by tt.maxca desc, id;
剩下的只是使用最大值的order by
。
我不知道如何在 laravel 中表达这个,但你的问题也被标记为 mysql。
关于php - 如何按一列排序,然后将同一列 ID 的最新 block 推到顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246087/