Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:有没有办法把这N个查询变成更少的查询?_Mysql_Sql_Greatest N Per Group_Sql Optimization - Fatal编程技术网

MySQL:有没有办法把这N个查询变成更少的查询?

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可

我有一个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可能是一个非常大的数字。因此,我非常希望避免逐个运行这些查询

有没有办法减少我需要运行的查询数量?可能是某种批量选择?

这应该可以:

$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