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

标签 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 之间的分布不均匀。

有没有一种方法可以编写此查询以保证(假设某个对象至少被“点赞”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/

相关文章:

php - 根据父模型查找条件查询

sql - 标准化总和的汇总列 (SQL) - 第 1 部分

java - 从两台服务器并发访问同一个表

java - 如何在 Talend Open Studio 作业中将 SQL 查询作为上下文变量传递

mysql - Django manytomany 查询奇怪的行为

php - mysql - 如果表中有任何匹配项,则选择表的第一行

php - 用于图像选项关系的 MySQL 数据库设计

Mysql查询使用多对多关系连接两个表

sql - asp.net mvc,原始 sql : Display data in Views generated using aggregate function

php - 如何在codeigniter中插入多列?