Mysql左外连接筛选器

Mysql左外连接筛选器,mysql,left-join,Mysql,Left Join,我试图从MySQL服务器中的数据中提取排行榜。它是由特定的玩家在每张地图上显示圈数 我目前提出的问题是: select d1.* from surf_times d1 left outer join surf_times d2 on (d1.Name = d2.Name and d1.Time > d2.Time) where d2.Name is null order by Time; 这将返回正确的结果,但是我需要按映射对其进行过滤。可在以下位置找到示例表: 此查询将以以下方式响应:

我试图从MySQL服务器中的数据中提取排行榜。它是由特定的玩家在每张地图上显示圈数

我目前提出的问题是:

select d1.*
from surf_times d1
left outer join surf_times d2
on (d1.Name = d2.Name and d1.Time > d2.Time)
where d2.Name is null
order by Time;
这将返回正确的结果,但是我需要按映射对其进行过滤。可在以下位置找到示例表:

此查询将以以下方式响应:

SteamID             Name                    Map             Time    Date
76561197991519598   Kuratheris              surf_utop       60.05   1445107360
76561198129490626   xXNightw0lfXx           surf_ace        60.84   1445106920
76561198156238243   ☆ The Pic ☆         surf_utop       62.35   1445107724
76561198049179442   J4N412N3                surf_utop       69.53   1445107519
76561197994977992   Rockape2620             surf_ace        72.26   1445107047
这几乎是正确的,但是我的查询只需要返回所选地图,而不是所有地图的时间。对于所选地图,正确的查询应响应前15次,例如“surf_utop”应响应下表:

SteamID             Name                    Map             Time    Date
76561197991519598   Kuratheris              surf_utop       60.05   1445107360
76561198156238243   ☆ The Pic ☆         surf_utop       62.35   1445107724
76561198049179442   J4N412N3                surf_utop       69.53   1445107519

我已经看了一些其他问题,例如,但是我还没有弄清楚。因此,只需添加到所选地图的位置即可

select d1.*
from surf_times d1
left outer join surf_times d2
on (d1.Name = d2.Name and d1.Time > d2.Time)
where d2.Name is null AND d1.map = 'surf_utop'
order by Time
limit 15;

结果:

+-------------------+-----------------+-----------+-------+------------+
|      SteamID      |      Name       |    Map    | Time  |    Date    |
+-------------------+-----------------+-----------+-------+------------+
| 76561197991519598 | Kuratheris      | surf_utop | 60.05 | 1445107360 |
| 76561198156238243 | ☆ The Pic ☆ | surf_utop | 62.35 | 1445107724 |
| 76561198049179442 | J4N412N3        | surf_utop | 69.53 | 1445107519 |
+-------------------+-----------------+-----------+-------+------------+

您不需要再次加入整个表,您可以使用:

SELECT st.*
FROM surf_times st
WHERE st.Time = 
    (SELECT MIN(t.Time) 
    FROM surf_times t 
    WHERE t.SteamID = st.SteamID AND t.Map = st.Map) 
        AND st.Map = 'surf_utop' -- or any other map
GROUP BY st.SteamID
ORDER BY st.Time
LIMIT 15;

这是个坏建议。依赖子查询比再次连接表糟糕得多。你应该看看这是怎么做的这似乎不太可能,但也许我误解了Join的问题是内存非常昂贵。它基本上加载整个表并在使用WHERE clauseAh,my bad中定义的规则“切片”之前连接它们。那很好:)。唯一的问题是有两个完全相同的时间的人会出现两次,但这并不是很糟糕。谢谢我编辑了查询,添加了GROUPBY st.SteamID以避免重复