mysql - 根据 2 个条件选择行

标签 mysql

我有2张表,记录:

CREATE TABLE IF NOT EXISTS `records` (
`recordid` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) NOT NULL,
`platform` varchar(255) NOT NULL,
`track` varchar(255) NOT NULL,
`trackid` int(11) NOT NULL,
`bike` varchar(255) NOT NULL,
`time` decimal(7,3) NOT NULL,
`faults` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`verified` varchar(3) NOT NULL DEFAULT 'no',
`wr` varchar(3) NOT NULL DEFAULT 'no',
PRIMARY KEY (`recordid`),
KEY `userid` (`userid`)
)

和用户:

CREATE TABLE IF NOT EXISTS `users` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`country` varchar(50) NOT NULL,
`verified` varchar(3) NOT NULL DEFAULT 'no',
PRIMARY KEY (`userid`)
) 

我存储了一些示例数据:

 +----------+--------+----------+----------------+---------+-----------+---------+--------+---------------------+----------+-----+
| recordid | userid | platform |     track      | trackid |   bike    |  time   | faults |        date         | verified | wr  |
+----------+--------+----------+----------------+---------+-----------+---------+--------+---------------------+----------+-----+
|      412 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 90.456  |      6 | 2017-02-18 19:54:27 | yes      | yes |
|      413 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 75.458  |      4 | 2017-02-18 19:54:39 | yes      | yes |
|      414 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 77.885  |      2 | 2017-02-18 19:55:02 | yes      | yes |
|      415 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 59.441  |      1 | 2017-02-18 19:55:12 | yes      | yes |
|      416 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 52.145  |      0 | 2017-02-18 19:55:21 | yes      | yes |
|      417 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 48.444  |      0 | 2017-02-18 19:55:26 | yes      | yes |
|      418 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 42.753  |      0 | 2017-02-18 19:55:33 | yes      | yes |
|      419 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 39.701  |      0 | 2017-02-18 19:55:42 | yes      | yes |
|      420 |      1 | Xbox     | Inferno IV     |      40 | Pit Viper | 745.159 |    254 | 2017-02-18 20:17:35 | yes      | yes |
|      421 |      1 | Xbox     | Inferno IV     |      40 | Pit Viper | 575.169 |    128 | 2017-02-18 20:17:50 | yes      | yes |
|      422 |      1 | Xbox     | Inferno IV     |      40 | Pit Viper | 465.456 |    101 | 2017-02-18 20:18:12 | yes      | yes |
|      423 |      1 | Xbox     | Inferno IV     |      40 | Pit Viper | 321.247 |     75 | 2017-02-18 20:18:29 | yes      | yes |
|      424 |      1 | Xbox     | Inferno IV     |      40 | Pit Viper | 236.456 |     35 | 2017-02-18 20:18:58 | yes      | yes |
|      425 |      1 | Xbox     | Inferno IV     |      40 | Pit Viper | 165.359 |     25 | 2017-02-18 20:19:17 | yes      | yes |
|      426 |      1 | Xbox     | Waterworks     |       2 | Pit Viper | 45.452  |    457 | 2017-02-18 23:13:12 | yes      | yes |
|      427 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 34.123  |      0 | 2017-02-18 23:21:47 | yes      | yes |
|      428 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 32.254  |      0 | 2017-02-18 23:24:32 | yes      | yes |
|      429 |      1 | Xbox     | Turbine Terror |       1 | Pit Viper | 31.169  |      0 | 2017-02-18 23:25:33 | yes      | yes |
|      430 |      1 | Xbox     | Waterworks     |       2 | Pit Viper | 50.000  |      0 | 2017-02-20 20:06:23 | yes      | yes |
|      431 |      3 | Xbox     | Turbine Terror |       1 | Pit Viper | 25.123  |      0 | 2017-02-20 20:21:54 | no       | yes |
+----------+--------+----------+----------------+---------+-----------+---------+--------+---------------------+----------+-----+

我有一个开发中的问题:

SELECT users.username, 
       records.platform, 
       records.track, 
       records.bike,  
       records.time, 
       records.faults, 
       records.date 
FROM records 
INNER JOIN users 
   ON records.userid = users.userid 
INNER JOIN (SELECT track, time, MIN(faults) AS faults 
            FROM records GROUP BY track) AS tracksWithMinFaults 
   ON records.track = tracksWithMinFaults.track 
  AND records.faults = tracksWithMinFaults.faults 
WHERE users.userid = 1  
ORDER BY records.trackid ASC

以上数据集查询结果:

+----------------+----------+----------------+-----------+---------+--------+---------------------+
|    username    | platform |     track      |   bike    |  time   | faults |        date         |
+----------------+----------+----------------+-----------+---------+--------+---------------------+
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 52.145  |      0 | 2017-02-18 19:55:21 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 48.444  |      0 | 2017-02-18 19:55:26 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 42.753  |      0 | 2017-02-18 19:55:33 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 39.701  |      0 | 2017-02-18 19:55:42 |
| TheRealTeeHill | Xbox     | Inferno IV     | Pit Viper | 165.359 |     25 | 2017-02-18 20:19:17 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 34.123  |      0 | 2017-02-18 23:21:47 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 32.254  |      0 | 2017-02-18 23:24:32 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 31.169  |      0 | 2017-02-18 23:25:33 |
| TheRealTeeHill | Xbox     | Waterworks     | Pit Viper | 50.000  |      0 | 2017-02-20 20:06:23 |
+----------------+----------+----------------+-----------+---------+--------+---------------------+

一点背景知识:我正在尝试为给定用户 ID 的每个轨道提取“最佳”记录。最佳记录可以定义为故障最少、用时最少的记录。到目前为止,我开发的查询是提取故障最少的用户的所有记录。查询还没有考虑时间!

我的问题:如何找到故障最少的每条轨道的最短时间?

这是我在 StackOverflow 上的第一篇文章,如果我遗漏了什么或做错了什么,请告诉我。提前感谢您的宝贵时间:)

编辑:我在建议的重复帖子中看不到解决方案,因为我正在寻找 2 个最小值,首先我需要提取所有最低故障记录,这是我的查询所做的,然后提取该组中的最短时间记录?如果解决方案在另一篇文章中,我看不到它:(

这是我想要达到的结果:

+----------------+----------+----------------+-----------+---------+--------+---------------------+
|    username    | platform |     track      |   bike    |  time   | faults |        date         |
+----------------+----------+----------------+-----------+---------+--------+---------------------+
| TheRealTeeHill | Xbox     | Inferno IV     | Pit Viper | 165.359 |     25 | 2017-02-18 20:19:17 |
| TheRealTeeHill | Xbox     | Turbine Terror | Pit Viper | 31.169  |      0 | 2017-02-18 23:25:33 |
| TheRealTeeHill | Xbox     | Waterworks     | Pit Viper | 50.000  |      0 | 2017-02-20 20:06:23 |
+----------------+----------+----------------+-----------+---------+--------+---------------------+

最佳答案

使用变量为每个轨道创建一个 row_number,但我发现您可能对平局有疑问。不确定您要如何处理这些问题。

DEMO

SELECT *
FROM (
        SELECT records.userid, 
               records.platform, 
               records.track, 
               records.bike,  
               records.time, 
               records.faults, 
               records.date,
               @row := IF( @track = records.track, 
                           @row + 1,
                           IF(@track := records.track, 1, 1)
                         ) as rn
        FROM records 
        CROSS JOIN (SELECT @row := 0, @track := '') as par
        WHERE records.userid = 1
        ORDER BY records.trackid ASC,
                 records.faults ASC,
                 records.time ASC
     ) as T
WHERE T.rn = 1;     

输出

enter image description here

关于mysql - 根据 2 个条件选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42372213/

相关文章:

Python MySQLdb 错误

php - 我的图像未从文件夹中删除

MySQL 总和基于之前按日期选择

mysql - 如何以编程方式确定 MySQL 关系类型 (1 :1, 1 :n, n :m) between tables?

mysql通过时间戳获取最新记录而无需子查询

php - 为什么我的 if 语句不适用于所有 mysql 结果?

MySQL:从另一个主机插入表

php - Laravel Eloquent 枢轴将变量传递给模型

php - Osticket:如何使用 "OR"约束过滤票证

php - 如何让查询按降序排列的一组值添加排名