Php 如何使用Eloquent和MySQL按最后一个id对分组结果排序?

Php 如何使用Eloquent和MySQL按最后一个id对分组结果排序?,php,mysql,laravel,sql-order-by,eloquent,Php,Mysql,Laravel,Sql Order By,Eloquent,我尝试了这个查询,但它只显示了orderid列,其余的则没有 $chapters = Test::select(DB::raw('*, max(id) as id')) ->groupBy('id_equip') ->orderBy('id', 'asc') ->get(); 在MySQL中,当使用GROUPBY时,您不能依赖order by子句(它不会像您预期的那样工作,即它将不会对结果分组排序,而是从组中返回随机行) 因此,

我尝试了这个查询,但它只显示了order
id
列,其余的则没有

$chapters = Test::select(DB::raw('*, max(id) as id'))
        ->groupBy('id_equip')
        ->orderBy('id', 'asc')
        ->get();

MySQL中,当使用
GROUPBY
时,您不能依赖
order by
子句(它不会像您预期的那样工作,即它将不会对结果分组排序,而是从组中返回随机行)

因此,为了实现您想要的,您需要一个
子查询
连接

// assuming tests table, group by id_equip, order by id
SELECT * FROM tests WHERE id = (
   SELECT MAX(id) FROM tests as t WHERE t.id_equip = tests.id_equip
) ORDER BY id

SELECT * FROM tests 
   JOIN (SELECT MAX(id) as id FROM tests ORDER BY id DESC) as sub
      ON sub.id = tests.id
这将获得每个
id\u设备的最高
id
,并返回每个设备的整行


现在,我雄辩地建议第一种方法,如果您希望它看起来更直观: 但是,如果要扫描的表很大(就性能而言),则每个表可能都是这样: 在这里,您需要在原始join语句中设置
order by
子句

如果愿意,还可以使用生成器生成该联接子查询:

$sub = Test::selectRaw('max(id)')
        ->groupBy('id_equip')
        ->orderBy('id', 'desc')
        ->toSql();

Test::join( DB::raw(
    "({$sub}) as sub"
  ), 'sub.id', '=', 'posts.id')
  ->get(['tests.*']);

你能为你的问题添加一些示例结果吗?我假设是MySQL。你知道在MySQL中,
orderby
如何与
groupby
一起工作吗?好。。这不是一个laravel问题,这是mysql问题,@SetKyarWaLar这是一个例子,但它只排序
id
列,您可以创建
name
来查看它@PhucLe它什么都没点,那是MySQL。。它只是根据
id\u-equipm
返回
max(id)
,因为这是聚合如何与group by一起工作的。
Test::join( DB::raw(
    '(select max(id) as id from tests group by id_equip order by id desc) sub'
  ), 'sub.id', '=', 'posts.id')
  ->get(['tests.*']);
$sub = Test::selectRaw('max(id)')
        ->groupBy('id_equip')
        ->orderBy('id', 'desc')
        ->toSql();

Test::join( DB::raw(
    "({$sub}) as sub"
  ), 'sub.id', '=', 'posts.id')
  ->get(['tests.*']);