【问题标题】:How to use Postgresql DISTINCT ON in Laravel Eloquent如何在 Laravel Eloquent 中使用 Postgresql DISTINCT ON
【发布时间】:2020-01-06 16:54:59
【问题描述】:

我正在使用 DISTINCT ON 从两个连接的表中获取最新的行。在我的情况下,订阅者属于许多类别,我需要获取订阅者所属的最新类别。我已经让它在原始查询中工作,但我需要使用 Eloquent 重新创建它。

SELECT DISTINCT ON (subscribers.id) subscribers.*, 
subscriber_categories.* 
FROM subscribers 
LEFT JOIN subscriber_categories
  ON subscribers.id = subscriber_categories.subscriber_id 
ORDER BY subscribers.id, subscriber_categories.created_at DESC;

我尝试了以下但没有工作。它正在从两个表中获取所有记录:

Subscribers::
   ->join('subscriber_categories', 'subscribers.id', '=', 'subscriber_categories.subscriber_id')
   ->distinct('subscribers.id')
   ->latest('subscribers.id', subscriber_categories.created_at)
   ->paginate(7);

【问题讨论】:

  • 在 laravel 中 distinct() 不接受任何参数:laravel.com/docs/6.0/queries#selects 它只是添加 SELECT DISTINCT 所以它是一个不同的所有选定字段。在您的情况下,它什么也不做,因为每个订阅者几乎与其他订阅者的主键不同。您可以通过添加 ->toSql() 来调试您的查询。
  • 是的,我也想要 ->toSql()。
  • 好的,在您调试查询之后,如果需要,您可以随时在此处询问更多详细信息。您可以随时编辑您的问题。

标签: sql laravel postgresql eloquent


【解决方案1】:

我终于做到了。 (完全放弃 DISTINCT ON):

     $subscribers = \DB::table('subscribers AS t1')
        ->leftJoin(\DB::raw('(SELECT * FROM subscriber_categories A WHERE id in (SELECT MAX(id) FROM subscriber_categories group by subscriber_id)) AS t2'), function($join) {
        $join->on('t1.id', '=', 't2.subscriber_id');
            })->select('t1.id', 't1.s_phonenumber', 't1.timesubscribed', 't2.category')->latest('t1.created_at')->paginate(7);

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,最后写了一个 laravel 扩展来处理它。您可以使用 composer 安装它,然后它就可以工作了!

    https://packagist.org/packages/datajoe/postgresql-distinct-on

    这就是你的情况:

    Subscribers::
       ->join('subscriber_categories', 'subscribers.id', '=', 'subscriber_categories.subscriber_id')
       ->distinctOn('subscribers.id')
       ->latest('subscribers.id', subscriber_categories.created_at)
       ->paginate(7);
    

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2019-10-19
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多