繁体   English   中英

将两个复杂的联接查询合并为一个

[英]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标记设置为1players表中找到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM