通过活动记录或查询获取大多数文章及其金额的用户

时间:2015-04-17 14:03:03

标签: php mysql sql activerecord yii2

我希望得到撰写文章最多的用户。我使用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();
  1. 问题是ActiveRecord为我提供了我需要的更多所需信息userDetails。但我没有得到应该在cnt
  2. 上的用户文章数量
  3. 使用查询,我得到user_id和文章数量。但是我加入userDetails并没有让它发挥作用。所有这些都不起作用:LEFT JOINRIGHT JOININNER JOIN
  4. 我有兴趣解决学习问题,但具体而言我需要帮助解决ActiveRecord问题。

3 个答案:

答案 0 :(得分:1)

好吧,我为ActiveRecord解决了这个问题。 ActiveRecords在模型中需要public $var;。因此,要获得金额,您必须将所提到的公共...添加到您的模型中,以便在我的情况下:

public $cnt;扩展了Articles

的ActiveRecord

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

答案 1 :(得分:1)

我对主动记录不太了解,但我认为以下是你正在寻找的东西

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
      );

答案 2 :(得分:1)

对于第二点,您应该将连接表中的必需列包含到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();