MySQL:有没有办法把这N个查询变成更少的查询?
我有一个N个整数的列表用户id,例如MySQL:有没有办法把这N个查询变成更少的查询?,mysql,sql,greatest-n-per-group,sql-optimization,Mysql,Sql,Greatest N Per Group,Sql Optimization,我有一个N个整数的列表用户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次: N可
[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次:
N可能是一个非常大的数字。因此,我非常希望避免逐个运行这些查询
有没有办法减少我需要运行的查询数量?可能是某种批量选择?这应该可以:
$str_ids=内爆“,”,$arr_ids
也许有更好的办法。若有,;让我知道 查看每个组最大n个标记Yes,例如另一个:肯定有更有效的变体,但想法是一样的。@newtover-什么是更有效的变体?@continuation,最有效的方法是在索引扫描期间遍历索引,获得所需的ID,然后加入其余字段。给定的解决方案创建两次表的完整副本,然后在完整扫描中应用条件。此外,它不能完全使用任何索引,因为ASC和DESC同时存在。@continuation,我错了,不是完整副本,只是给定用户的子集。但无论如何,我会看看类似的问题,比较数据中的变量。你尝试过这个解决方案吗?我之所以说可能有更好的方法,是因为这个查询可能会被认为有点混乱,而不是效率低下。
SELECT *
FROM content
WHERE user_id=1001
ORDER BY score DESC
LIMIT 3;
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