我希望得到撰写文章最多的用户。我使用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();
userDetails
。但我没有得到应该在cnt
user_id
和文章数量。但是我加入userDetails
并没有让它发挥作用。所有这些都不起作用:LEFT JOIN
,RIGHT JOIN
,INNER JOIN
。我有兴趣解决学习问题,但具体而言我需要帮助解决ActiveRecord问题。
答案 0 :(得分:1)
好吧,我为ActiveRecord解决了这个问题。 ActiveRecords在模型中需要public $var;
。因此,要获得金额,您必须将所提到的公共...添加到您的模型中,以便在我的情况下:
public $cnt;
扩展了Articles
现在我可以使用我的问题中的给定请求访问它。但这只是解决了第一点。对于更复杂的查询,我仍然对第二种方式感兴趣。
答案 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();