如何在Laravel查询构建器中获取一列具有最高值而另一列具有特定值的行

时间:2019-11-13 14:32:01

标签: php sql laravel

╔════╦═══════╦═══════╦═══════╗
║ id ║ Col A ║ Col B ║ Col C ║
╠════╬═══════╬═══════╬═══════╣
║ 1  ║ 36    ║ 50    ║ AAA   ║
║ 2  ║ 36    ║ 50    ║ BBB   ║
║ 3  ║ 36    ║ 44    ║ CCC   ║
║ 4  ║ 36    ║ 44    ║ DDD   ║
║ 5  ║ 56    ║ 33    ║ EEE   ║
║ 6  ║ 56    ║ 78    ║ FFF   ║
╚════╩═══════╩═══════╩═══════╝

如何使用laravel查询生成器来获取表行,其中“ Col B”中的最高编号和“ Col A”中的相同值?

最后,我希望得到如下结果:

╔════╦═══════╦═══════╦═══════╗
║ id ║ Col A ║ Col B ║ Col C ║
╠════╬═══════╬═══════╬═══════╣
║ 1  ║ 36    ║ 50    ║ AAA   ║
║ 2  ║ 36    ║ 50    ║ BBB   ║
║ 6  ║ 56    ║ 78    ║ FFF   ║
╚════╩═══════╩═══════╩═══════╝

获得这些行的原因是,在“ Col A”中有两个数字36和56。“ Col B”中的最高数字是36的50,而“ Col B”中的最高数字是56的78。

3 个答案:

答案 0 :(得分:1)

以下是满足您要求的SQL查询:

SELECT * FROM `test` WHERE col_b in (SELECT MAX(col_b) from test GROUP BY col_a);

test作为表名,col_acol_b分别作为Col A和Col B。

以下是上述查询的Laravel查询构建器版本:

Test::select('*')
        ->whereIn('col_b', function($query)
        {
           $query->from('test')->select(DB::raw("MAX(col_b)"))->groupBy('col_a');
        })->get();

希望它对您有用。 :)

答案 1 :(得分:0)

我不确定您是否需要Laravel Query Builder或开发查询逻辑方面的帮助。这是将在SQL Server中运行的查询逻辑。这些概念适用于所有RDBMS。

select a.id
, a.[Col A]
, a.[Col B]
, a.[Col C]
from TblA a
  inner join (
    select [Col A]
    , max([Col B]) as 'Col B'
    from TblA
    group by [Col A]
  ) b on b.[Col A] = a.[Col A]
     and b.[Col B] = a.[Col B]

然后,您可以使用正确的答案from another post将其转换为可在Laravel Query Builder中使用。

答案 2 :(得分:0)

尝试一下:

$result = DB::table('your_table')
        ->whereIn('your_table.col_b', function($query) {
            $query->from('your_table')
                  ->select(DB::raw("MAX(col_b)"))
                  ->groupBy('col_a');
        })->get();

dd($result);

enter image description here