Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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-为具有不同条件的组中的每一行获取count()_Mysql - Fatal编程技术网

MySQL-为具有不同条件的组中的每一行获取count()

MySQL-为具有不同条件的组中的每一行获取count(),mysql,Mysql,我有一个高分表分数:id int,deviceid int,value int,board int。 我想显示一个特定球员的位置。目前,我正在用PHP做这件事: 我选择球员有分数和分数本身的所有棋盘: select board, min(value) as value from scores where deviceid = 1234 group by board 然后,对于每行$board,$value,我选择: select count(id) from scores where boar

我有一个高分表分数:id int,deviceid int,value int,board int。 我想显示一个特定球员的位置。目前,我正在用PHP做这件事:

我选择球员有分数和分数本身的所有棋盘:

select board, min(value) as value
from scores
where deviceid = 1234
group by board
然后,对于每行$board,$value,我选择:

select count(id) from scores
where board = $board and value < $value
通过为得分小于指定值的特定棋盘选择行数,我得到了玩家的位置,第一个玩家将得到位置0,因此显示时将增加1

我知道这是非常低效的,所以我正在寻找一种更快的方法。这可能是在一个带有光标的存储过程中完成的,但对于100块板,我最多需要进行1+100次选择

简而言之,我想在伪sql中执行类似的操作:

select board, min(value) as val,
       count(id) from _this_group_ where value < val
from scores
where deviceid = 1234
group by board

您可以尝试以下方法:

SELECT a.board, b.val COUNT(1) AS cnt
FROM scores a
    INNER JOIN(
        SELECT board, MIN(value) as val
        FROM scores
        WHERE deviceid = 1234
        GROUP BY board
    ) b
     ON a.board = b.board
    AND a.value < b.val
WHERE a.deviceid = 1234
GROUP BY a.board;


谢谢,我刚刚在first select中添加了scores.board列,这样我就可以知道哪个板是所选的分数。那么,有没有办法避免扫描数据库中的所有行?如果我有1000000行,这个查询的mysql解释说它通过了1000000行。deviceid上的索引将加速子查询。板上的索引,值可能会加快外部查询,但在最坏的情况下,玩家在所有板上的得分最高,它仍然需要遍历几乎所有的行。谢谢,我已经在deviceid上有了索引,但第二个索引大大加快了查询速度!
SELECT a.board, MIN(a.value) as val,
       (SELECT COUNT(1)
        FROM scores b
        WHERE b.board = a.board AND
        b.value < MIN(a.value)) AS cnt
FROM scores a
WHERE a.deviceid = 1234;
SELECT scores.board, count(1) AS position
FROM scores
JOIN
  (SELECT board, MIN(value) AS value
   FROM scores
   WHERE deviceid = 1234
   GROUP BY board
  ) player_scores
ON scores.board = player_scores.board
WHERE scores.value < player_scores.value
GROUP BY scores.board