我有一个查询,它会从users
表中提取喜欢特定对象的用户。评分存储在ratings
表中。到目前为止我提出的查询看起来像这样:
SELECT user.id, user.name, user.image
FROM users
LEFT JOIN ratings ON ratings.userid = user.id
WHERE rating.rating > 0
AND rating.objectId IN (1,2,3,4)
我希望能够在此查询上放置LIMIT
,以避免返回所有结果,而我每个ID只需要3个左右的结果。例如,如果我只放一个LIMIT 12
,我可能会得到8条记录,其中一个ID,另外一条记录为1或2,即ID中的分布不均匀。
有没有办法编写这个查询以保证(假设某个对象至少被“喜欢”了三次),我为列表中的每个ID得到三个结果?
答案 0 :(得分:2)
通过使用变量设置行号,然后过滤该结果以仅显示第1-3行应该起作用
SET @last_objectId = 0;
SET @count_objectId = 0;
SELECT id, name, image FROM (
SELECT
user.id,
user.name,
user.image,
@count_objectId := IF(@last_objectId = rating.objectId, @count_objectId, 0) + 1 AS rating_row_number,
@last_objectId := rating.objectId
FROM users
LEFT JOIN ratings ON (ratings.userid = user.id)
WHERE
rating.rating > 0 AND
rating.objectId IN (1,2,3,4)
ORDER BY rating.objectId
) AS subquery WHERE rating_row_number <= 3;