我有一个查询,它从 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 之间的分布不均匀。
有没有一种方法可以编写此查询以保证(假设某个对象至少被“点赞”3 次),我会为列表中的每个 ID 获得三个结果?
最佳答案
通过使用变量设置行号,然后过滤该结果以仅显示第 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;
关于mysql - 如何使用 WHERE id IN(1,2,3,4) 获得均匀分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11233770/