【问题标题】: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') 时才能使其工作

标签: mysql laravel orm eloquent aggregate-functions


【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多