Mysql 左外连接过滤方式

标签 mysql left-join

我正在尝试从 MySQL 服务器中的数据中提取排​​行榜。这是为了显示某些玩家在每张 map 上的单圈时间。

我目前提出的查询是这样的:

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;

这会返回正确的结果,但我需要通过 map 对其进行过滤。可以在 http://sqlfiddle.com/#!2/3e9c6/1 找到示例表

此查询将响应:

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

这几乎是正确的,但是我的查询只需要返回所选 map 而不是所有 map 的时间。正确的查询应该响应所选 map 的前 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

我看过其他问题,例如 SQL Select only rows with Max Value on a Column,但没能弄明白。

最佳答案

你不需要再次JOIN整个表,你可以使用:

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;

关于Mysql 左外连接过滤方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191940/

相关文章:

sql - 优化 SQL 查询

java - 如何使用 CriteriaBuilder 设置此 SQL 查询?

mysql - Sequelize - afterBulkUpdate() 如果更新与否如何获取

MySQL查询通过列名选择表名

MySQL : Don't show duplicate result on SELECT

mysql - 在 JOIN 中使用具有 'AS' 的字段的指定名称

NHibernate 左外连接不相关实体

sql - 无法应用于 Athena 中的 bigint、varchar

html - 检查按下了哪个提交按钮

PHP echo/print 基于从 Mysql 表检索的空值