[英]Combining two complex join queries to one
第一个查询:
SELECT a.*
FROM `records` a
INNER JOIN (SELECT map, MIN(time) as time
FROM `records` GROUP BY map) as b ON a.time=b.time ORDER BY a.map
第二个查询:
SELECT a.*
FROM (SELECT *
FROM `players`
WHERE cheat=0) c JOIN `records` a ON a.authid = c.authid
第一个查询为每个唯一的map
具有最低time
值的行。
第二个查询在cheat
标记设置为1
的players
表中找到records
表中未被玩家完成的所有行。
我尝试将这两个查询结合起来以找到每个唯一映射的最低非欺骗者时间,如下所示:
SELECT a.*
FROM `records` a
JOIN (SELECT * FROM `players` WHERE cheat=0) c ON a.authid=c.authid
INNER JOIN (SELECT map, MIN(time) as time
FROM `records` GROUP BY map) as b ON a.time=b.time ORDER BY a.map
这是相当明显发生了什么,但我不知道怎么纠正:不是获取最低的time
没有启用cheat
标记它说,最低的time
是不是一个合法的时间,而忽略了该记录map
。
关于如何正确组合这两个查询的任何想法?
编辑:
records
结构:
map [varchar(32)] | authid [varchar(35)] | name [varchar(32)] | time [decimal(13,6)] | date [datetime] | weapon [varchar(32)]
players
结构:
id [int(8)] | authid [varchar(20)] | name [varchar(32)] | rank [float] | perc [float] | points [float] | uwrs [float]
我认为您加入的第一个查询缺少标准,应该是
ON a.time=b.time
AND a.Map=b.map
尽管这里不是问题,但问题是您要为每个地图选择第一个记录,然后仅通过非作弊来保留这些记录。 您需要获得每张由非作弊者竞争的地图的第一条记录。 这是一个细微的差别,您只需要将对players表的联接移到子查询中:
SELECT a.*
FROM records AS a
INNER JOIN
( SELECT r.Map, MIN(r.time) AS Time
FROM records AS r
INNER JOIN players AS p
ON p.authid = r.authid
WHERE p.Cheat = 0
GROUP BY r.map
) AS MinR
ON MinR.map = a.map
AND MinR.time = a.time
ORDER BY a.map;
以下查询将为您提供所需的结果:
SELECT a.*
FROM `records` a
INNER JOIN
(SELECT map, MIN(time) as time
FROM `records` r
INNER JOIN `players` p
ON a.authid = c.authid
WHERE p.cheat = 0
GROUP BY map) as b
ON a.map = b.map AND a.time=b.time
ORDER BY a.map;
首先,仅针对非作弊玩家获得最短时间。 然后获得这些时间的记录。
另外,我在JOIN
添加了a.map = b.map
以确保连接了相同的地图(以防有多个具有相同记录时间的地图)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.