Php 通过活动记录或查询获取文章最多的用户及其数量

Php 通过活动记录或查询获取文章最多的用户及其数量,php,mysql,sql,activerecord,yii2,Php,Mysql,Sql,Activerecord,Yii2,我想找到写文章最多的用户。我可以通过以下两种方式使用ActiveRecord: $table = Articles::find() ->select('articles.*, COUNT(*) AS cnt') ->with('user','userDetails') ->groupBy('articles.user_id') ->orderBy(('cnt DESC')) ->limi

我想找到写文章最多的用户。我可以通过以下两种方式使用ActiveRecord:

$table = Articles::find()
        ->select('articles.*, COUNT(*) AS cnt')
        ->with('user','userDetails')
        ->groupBy('articles.user_id')
        ->orderBy(('cnt DESC'))
        ->limit(10)
        ->offset($offset)
        ->all();
$query = (new Query())
        ->select('articles.user_id, COUNT(*) AS num_articles')
        ->from('articles')
        ->join('LEFT JOIN', 'user_details', 'user_details.user_id = articles.user_id')
        ->groupBy('articles.user_id')
        ->orderBy('num_articles DESC')
        ->limit(10)
        ->offset($offset)
        ->all();
并使用如下查询:

$table = Articles::find()
        ->select('articles.*, COUNT(*) AS cnt')
        ->with('user','userDetails')
        ->groupBy('articles.user_id')
        ->orderBy(('cnt DESC'))
        ->limit(10)
        ->offset($offset)
        ->all();
$query = (new Query())
        ->select('articles.user_id, COUNT(*) AS num_articles')
        ->from('articles')
        ->join('LEFT JOIN', 'user_details', 'user_details.user_id = articles.user_id')
        ->groupBy('articles.user_id')
        ->orderBy('num_articles DESC')
        ->limit(10)
        ->offset($offset)
        ->all();
  • 问题是ActiveRecord提供了我需要的更多信息
    userDetails
    。但是我没有得到用户在
    cnt
  • 通过查询,我得到了
    用户id
    和文章数量。但是我不能通过加入
    userDetails
    来让它工作。所有这些都不起作用:
    左连接
    右连接
    内部连接

  • 我对解决这两个问题感兴趣是为了学习,但具体来说,我需要帮助解决ActiveRecord问题。

    好的,我为ActiveRecord解决了这个问题。ActiveRecords需要一个
    public$var。因此,要获得金额,您必须添加所提到的公众。。。对您的模型进行修改,以便在我的情况下:

    public$cnt
    扩展
    文章的ActiveRecord


    现在,我可以使用问题中给定的请求访问它。但这正好解决了第一点。对于更复杂的查询,我仍然对第二种方法感兴趣。

    我对活动记录不太了解,但我认为下面是您需要的

    select * from user_details where user_id in 
          (select A.user from 
             (select user_id as user, COUNT(*) AS num_articles 
               from articles group by user_id order by num_articles desc LIMIT 10)A
          );
    

    对于第二点,您应该将联接表中的必填列包含到
    select
    语句中:

    $query = (new Query())
            ->select('articles.user_id, COUNT(*) AS num_articles, user_details.username as username')
            ->from('articles')
            ->join('LEFT JOIN', 'user_details', 'user_details.user_id = articles.user_id')
            ->groupBy('articles.user_id')
            ->orderBy('num_articles DESC')
            ->limit(10)
            ->offset($offset)
            ->all();
    

    但是,此查询不会提供记录的计数。如果同时需要用户详细信息和记录计数,则应查看rank方法。