mysql - 为每个唯一列值选择不禁止用户的最短时间

标签 mysql sql

我有一堆玩家记录,一堆世界纪录,还有一堆被禁止的玩家:

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 列表和 timewrs 中的相应行开始如果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/

相关文章:

sql - 将多对多关系中的所有相关记录分组,SQL 图形连接组件

sql - 如何将线串分割成单独的线段?

SQL:使用公用表表达式递归获取父记录

php - MySQL 单个 SELECT 在 PHP 中显示错误但在 PHPMYADMIN 中不显示

php - 我如何使用一个表项中的 id 连接另一个表项

html - 如何在不提交主表单的情况下填充选择/组合框 (ASP)

mysql - Python MySQL Docker 连接

php - 在上传到 Mysql 之前获取 blob 字符串的大小

sql - Oracle:分层查询中的编号组

mysql - 为什么 MySQL AI id 会这样?