相当于mysql / laravel中的qualify语句?

时间:2017-03-04 12:34:22

标签: php mysql sql laravel laravel-5.4

我有一个如下所示的数据库:

ID |   facebook_id  | likes | created_at
--------------------------------------------------
 1 |      x         | 100   | 2017-01-01 12:10:15
 2 |      x         | 110   | 2017-01-02 12:10:15
 3 |      y         | 115   | 2017-01-01 12:10:15
 4 |      y         | 120   | 2017-01-02 12:10:15
 5 |      z         | 200   | 2017-01-01 12:10:15
 6 |      z         | 201   | 2017-01-01 12:10:15
 7 |      z         | 200   | 2017-02-02 12:10:15
 8 |      z         | 205   | 2017-02-03 12:10:15
 9 |      z         | 250   | 2017-03-04 12:10:15

我希望获得表格中每个唯一facebook_id的最新记录,然后按likesdescending顺序排序。我正在使用laravel 5.4mysql作为数据库。在teradata我会做类似

的事情
QUALIFY ROW_NUMBER() OVER(PARTITION BY facebook_id ORDER BY created_at DESC) = 1

facebook_id排序结果,并按唯一的facebook_id获取最新一行。但是我不确定如何在laravel / mysql中执行此操作。

我试过了

Database::select('facebook_id', 'likes', 'created_at')
          ->orderBy('likes', 'desc')
          ->distinct('facebook_id')
          ->latest('created_at')
          ->limit(20)
          ->get();

但它只是按likes订购,并没有让我独一无二facebook_id

我的结果是:

Top Profile ID: z Likes:250
Top Profile ID: z Likes:205
Top Profile ID: z Likes:201
Top Profile ID: z Likes:200

我想得到的是:

Top Profile ID: z Likes:250
Top Profile ID: y Likes:120
Top Profile ID: x Likes:110

2 个答案:

答案 0 :(得分:0)

这个问题:

  

我想获得每个独特的facebook_id的最新记录   在表格中,然后按降序排列。

有答案。有多种方法。这是一个:

select t.*
from t
where t.created_at = (select max(t2.create_at)
                      from t t2
                      where t2.facebook_id = t.facebook_id
                     )
order by t.likes desc;

答案 1 :(得分:0)

我认为您在查询groupBy上只需要facebook_id

->groupBy('facebook_id')