1

我试图在 MYSQL 中做这样的事情,但没有通过 PHP foreach 进行多次查询(在我的情况下为 50 次)。

foreach($this->map_ids as $key => $val) {
    $this->db->query("SELECT scores.profile_number, scores.score  FROM scores 
                    LEFT JOIN players ON scores.profile_number = players.profile_number
                    WHERE scores.map_id = {'$val'}
                    AND scores.profile_number IN (SELECT profile_number FROM players WHERE banned = 0) LIMIT 10");    
}

这是我在没有限制的情况下检索所有分数时的大致外观。

profile             score   map_id
76561198026851335   2478    47455
76561198043770492   2480    47455
...                 ...     ...
76561198043899549   1340    47452
76561198048179892   1345    47452
...                 ...     ...

我只想要每个唯一 map_id 中的 10 个条目(分数)。

4

2 回答 2

2

这很难做到,但我最终使用用户变量来完成这项工作,请查看以下演示。显然我的数据结构已经简化了很多,但它应该足以让你继续前进:

SQL 小提琴示例

这是任何有兴趣跳过演示的人的 SQL(可怕,我知道)

SELECT *
FROM (
      SELECT profile_number, score, map_id
      FROM ( 
        SELECT 
          profile_number, score, map_id, 
          IF( @prev <> map_id, @rownum := 1, @rownum := @rownum+1 ) AS rank, 
          @prev := map_id
        FROM scores 
        JOIN (SELECT @rownum := NULL, @prev := 0) AS r 
        ORDER BY map_id
      ) AS tmp 
      WHERE tmp.rank <= 10 
      ) s
      JOIN players p
        ON s.profile_number = p.profile_number

基本上,发生的事情是这样的:
ORDER BY map_id
按 map_id 对表进行排序,以便所有相同的表都在一起。

接下来我们使用以下逻辑为每一行分配一个rownumber:
IF( @prev <> map_id, @rownum := 1, @rownum := @rownum+1 )
如果前一行的map_id不等于当前行的ID,则设置row number = 1,否则将rownumber增加1。

最后,只返回行号小于或等于 10 的行
WHERE tmp.rank <= 10

希望这能让你更清楚一点。

于 2013-07-18T13:16:33.063 回答
0

您可以使用limit directive.

SELECT * FROM `your_table` LIMIT 0, 10 

This will display the first 10 results from the database.

SELECT * FROM `your_table` LIMIT 5, 5 

这将显示记录 6、7、8、9 和 10

于 2013-07-18T12:07:01.997 回答