我有一堆玩家记录,一堆世界纪录,还有一堆被禁止的玩家:
describe records
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| type | varchar(3) | NO | MUL | NULL | |
| map | varchar(31) | NO | MUL | NULL | |
| authid | varchar(31) | NO | | NULL | |
| time | decimal(13,6) | NO | | NULL | |
| date | datetime | NO | | NULL | |
+--------+---------------+------+-----+---------+----------------+
describe wrs
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| map | varchar(31) | NO | MUL | NULL | |
| route | varchar(31) | NO | | NULL | |
| time | decimal(5,2) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
describe banned
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| authid | varchar(31) | NO | UNI | NULL | |
+--------+-------------+------+-----+---------+----------------+
我正在尝试选择最小值 time
来自records
每个独特的表 map
哪里authid
(玩家标识符)在 banned
中找不到表。
我也想找回世界纪录time
来自wrs
同样map
.
我想选择map
, authid
,和time
来自records
仅当 type
等于“pro”但想保留 map
从独特 map 列表和 time
从 wrs
中的相应行开始如果type
不等于“pro”。
我的问题是检索正确/对应的 authid
来自records
检索最小值时的表 time
/map
。我已经成功地做了这样的事情:
SELECT m.map, minTime, wrTime, wrTime / minTime AS ratio, minTime - wrTime AS diffTime FROM
# get all unique maps from records table
(SELECT map FROM records GROUP BY map) AS m
LEFT JOIN
# find min time for each map where type is pro
(SELECT type, map, MIN(time) AS minTime FROM records WHERE type = "pro" GROUP BY map) AS p
ON m.map = p.map
LEFT JOIN
# find world record time for each map
(SELECT map, MIN(time) AS wrTime FROM wrs GROUP BY map) AS w
ON m.map = w.map
但它不考虑被禁止的玩家,因为我无法检索正确的 authid
选择最小值时的值 time
(旁白:我什至不确定在 where 子句中是否使用正确的 type
)。如果我有正确的 authid
,我可以轻松地将如下内容添加到查询中以忽略被禁止的玩家:
SELECT * FROM records r LEFT JOIN banned b ON r.authid = b.authid WHERE b.authid IS NULL
希望我说得有道理。如果没有,请询问更多信息。
最佳答案
我不确定我是否完全理解您的问题,但我认为以下 SQL 可能会帮助您:
My issue is retrieving the correct/corresponding authid from the records table when retrieving the minimum time/map. "
SELECT
map,
MIN(time) AS minTime
FROM records
WHERE
authid NOT IN (SELECT authId FROM banned)
GROUP BY map
关于mysql - 为每个唯一列值选择不禁止用户的最短时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475116/