雄辩地通过分组找到具有最大值的行

Posted

技术标签:

【中文标题】雄辩地通过分组找到具有最大值的行【英文标题】:Eloquent finding the row with the max value with grouping 【发布时间】:2017-04-20 21:23:24 【问题描述】:

您好,我有问题和解决方案http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html,即找到某一列的最大值所在的行,按其他值分组。

我的问题是如何将下面的查询转换为 Eloquent 格式?

SELECT s1.article, dealer, s1.price
    FROM shop s1
    JOIN (
      SELECT article, MAX(price) AS price
      FROM shop
      GROUP BY article) AS s2
ON s1.article = s2.article AND s1.price = s2.price;

谢谢。

【问题讨论】:

你试过raw-expressions吗? 我有,但我无法让它以某种方式工作,只有当我将整个 SQL 放入 DB::select('query') 时才能使其工作 【参考方案1】:

您可以直接使用DB::query()。您还可以从Queries - Joins 获得帮助以应用联接或Raw Expressions。

【讨论】:

【参考方案2】:

如果使用 eloquent,您可以在下面使用原始 Builder,只需删除表名并替换为您的模型实例

DB::table(DB::raw('shop as s1'))
   ->join(
       DB::raw('(SELECT article, MAX(price) AS price FROM shop GROUP BY article) as s2'), 
     function($query) 
       $query->on('s1.article', '=', 's2.article')
             ->on('s1.price', '=', 's2.price');
     )->get();

【讨论】:

有没有办法摆脱原始表名,因为在源代码中会有多个硬编码表名。【参考方案3】:

试试这个:

Shop::join('shop as shop2', 'shop.article', '=', 'shop2.article')
        ->groupBy('shop.article', 'shop.price')
        ->havingRaw('max(shop2.price) = shop.price')
        ->get()

【讨论】:

以上是关于雄辩地通过分组找到具有最大值的行的主要内容,如果未能解决你的问题,请参考以下文章

如何选择具有最大值的行的所有列

Mysql按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行

Oracle PLSQL - 选择具有最大值的行

删除除具有最大值的行之外的所有行

从Map的Java流中,通过键对它们进行分组,并找到最大值无法正常工作

在特定列 postgres 中选择具有最大值的组中的行