【问题标题】:Create subquery in Laravel - Query builder在 Laravel 中创建子查询 - 查询构建器
【发布时间】:2015-10-31 09:18:15
【问题描述】:

我尝试创建一个子查询。目前,我的两个查询是:

select `key` from messages group by `key`;

和

select * from messages where `key` = 'KEY_RECUP_AU_DESSUS' order by created_at DESC LIMIT 1;

目的是突出我的表messages所有按键分组的元素并保留最后一个元素(created_at desc)

谢谢

【问题讨论】:

    标签: php laravel laravel-5 eloquent query-builder


    【解决方案1】:

    您可以通过两种不同的方式做到这一点。

    查询生成器:

    DB::table('messages AS a')
    ->leftJoin('messages AS b', function($join) {
        $join->on('a.created_at', '<', 'b.created_at');
        $join->on('a.key', '=', 'b.key');
    })
    ->groupBy(['a.key', 'a.message', 'a.created_at'])
    ->havingRaw('COUNT(b.key) < 1')
    ->select(['a.key', 'a.message', 'a.created_at'])
    ->get();
    

    PARTITION BY 的另一种方式

    SELECT 
          key,
          message,
          created_at
    FROM (
        SELECT 
              key, 
              message, 
              created_at, 
              rank() OVER (PARTITION BY key ORDER BY created_at DESC) AS rank 
        FROM 
              messages
    ) AS foo WHERE foo.rank = 1;
    

    如果我们假设你有这样的表。

    postgres=# select * from messages;
     id |   key   |        message         |         created_at
    ----+---------+------------------------+----------------------------
      1 | contact | send from contact page | 2015-10-31 19:45:16.850698
      2 | contact | contact page message   | 2015-10-31 19:45:34.417231
      3 | product | product 1              | 2015-10-31 19:45:44.49584
      4 | product | product 2              | 2015-10-31 19:45:46.856691
      5 | contact | hello it is me         | 2015-10-31 18:45:35.801967
      6 | about   | who are you            | 2015-10-31 19:46:04.123369
      7 | product | product 3              | 2015-10-31 19:46:12.414364
      8 | about   | hi guys                | 2015-10-31 19:46:18.23442
    (8 rows)
    

    两个不同的查询结果会是这样的

    postgres=# select key, message, created_at from (select key, message, created_at, rank() over (partition by key order by created_at desc) as rank from messages) foo where rank = 1;
       key   |       message        |         created_at         
    ---------+----------------------+----------------------------
     about   | hi guys              | 2015-10-31 19:46:18.23442  
     contact | contact page message | 2015-10-31 19:45:34.417231 
     product | product 3            | 2015-10-31 19:46:12.414364 
    (3 rows)
    

    【讨论】:

      【解决方案2】:

      这样的事情应该可以工作:

      $data = DB::table('messages')->whereIn('key',function($q) {
          $q->select('key')->from('messages')->groupBy('key');
      })->latest()->take(1)->get();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2021-09-25
      • 2017-02-15
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多