我有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
,但我发现您可能对平局有疑问。不确定您要如何处理这些问题。
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;
输出
关于mysql - 根据 2 个条件选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42372213/