如何使用WHERE id IN(1,2,3,4)获得均匀分布

时间:2012-06-27 19:42:24

标签: mysql sql

我有一个查询,它会从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得到三个结果?

1 个答案:

答案 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;