作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含 N
个整数的 user_id
列表,例如
[1001, 1023, 13452, 1679834, ...]
和一个表格:
CREATE TABLE content (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_id INT,
content VARCHAR(100),
score INT
);
我需要从 user_id
中获取这 N
个整数,并为每个 user_id
获取前 3 个内容
具有最高的分数
。所以基本上我需要运行这个查询N
次:
SELECT *
FROM content
WHERE user_id=1001
ORDER BY score DESC
LIMIT 3;
N
可能是一个非常大的数字。所以我非常想避免一一运行这些查询。
有什么方法可以减少我需要运行的查询数量吗?也许某种批量选择?
最佳答案
这应该有效:
$str_ids = implode(', ', $arr_ids);
SELECT id, user_id, content, score
FROM ( SELECT *, (@rownum := @rownum + 1) AS rownum,
case when @user_id IS NULL then @user_id := c.user_id when @user_id != c.user_id then CONCAT(@rownum := 0, @user_id := c.user_id) AS dummy_value
FROM ( SELECT *
FROM content
WHERE user_id IN ({$str_ids})
ORDER BY user_id ASC, score DESC) AS c, (@rownum := 1, @user_id := NULL) AS vars
HAVING rownum <= 3
也许有更好的方法来做到这一点。如果是这样;让我知道!
关于MySQL:有什么办法可以将这N个查询变成更少的查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813250/
我是一名优秀的程序员,十分优秀!