雄辩地通过分组找到具有最大值的行
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按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行