选择包含每个唯一字段值的行和&按限制排序另一个字段

时间:2013-08-25 19:59:21

标签: php javascript mysql sql greatest-n-per-group

我的表中有以下字段/结构:

(`map`, `authid`, `name`, `time`, `date`, `weapon`)

每次玩家在游戏中完成地图时,此信息都会存储在此表格的SQL行中,只要每个map玩家用来完成它的time低于任何先前存储的time。这意味着对于任何给定的玩家map / authid,每name只会有一行。

现在,问我的问题。作为我的SQL菜鸟,我希望找出一个运行的查询,它将选择最低的15次每个地图(显然,如果每个地图少于15个条目,则将返回所有这些条目) 。我知道我可以在PHP中创建如下的查询:

SELECT * FROM tablename WHERE map='". $map ."' ORDER BY time LIMIT 15;

但我需要最终得到一个包含每个唯一map值的多维数组(PHP)或对象(JS),以便稍后在我的代码中使用(并且需要按时间排序),即:

{"map1":[
    {"authid1":"val",
     "name1":"dude1",
     "time":"23.46",
     "date":"val",
     ...},
     {"authid1":"val",
     "name1":"dude2",
     "time":"42.33",
     "date":"val",
     ...},
     ...],
 "map2":[
    ...
    ...]
}

如果我不能纯粹通过SQL查询来完成这个,那么我如何利用PHP或JS来完成我的目标呢?

1 个答案:

答案 0 :(得分:0)

$q1 = "SELECT map from tablename GROUP BY map ORDER BY map";
$r1 = $db->mysqli_query($q1);
while ($mapRow = mysqli_fetch_assoc($r1)) {
    $map = $mapRow['map'];
    $q2 = "SELECT * FROM tablename WHERE map='". $map ."' ORDER BY time LIMIT 15";
    $r2 = $db->mysqli_query($q2);
    while ($dataRow = mysqli_fetch_assoc($r2)) {
        $map[] = $dataRow;
    }
}