2017-02-21 46 views
1

我有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。最佳記錄可被定義爲具有最低故障和最低時間的記錄。到目前爲止,我所開發的查詢是爲具有最低故障的用戶提供所有記錄。查詢不考慮時間!

我的問題:如何找到最低時間以最低的故障每個軌道?

這是我在計算器上的第一篇文章,如果我錯過了什麼或做了什麼錯了,請讓我知道。在此先感謝您的時間:)

編輯:我看不到在建議的重複帖子中的解決方案,因爲我正在尋找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 | 
+----------------+----------+----------------+-----------+---------+--------+---------------------+ 
+0

看起來不錯,但我們更喜歡數據樣本爲文本[爲什麼-MAY-I-沒有上傳圖像-的代碼(HTTP: //meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557) –

+0

的可能的複製[如何我可以選擇具有MAX(列值)的行,由SQL中的另一列DISTINCT?](http://stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-通過-ANO ther-column-in-sql) –

+0

向我展示一些示例數據和預期結果作爲文本表[爲什麼可能不上傳圖像的代碼](http://meta.stackoverflow.com/questions/ 285551 /爲什麼-可以-I-不上傳圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

0

試試這個

SELECT 
     users.name,records.platform,records.track,records.min_time,records.bike,records.time,records.min_faults,records.date 
    FROM users 
    INNER JOIN 
    (SELECT MIN(time) as min_time,time, MIN(faults) AS min_faults,faults,platform,track,bike,date FROM records GROUP BY trackid) records 
    ON records.time = records.min_time 
    AND records.faults = records.min_faults 
    AND records.recordid = users.userid 
    WHERE users.userid = 1  
    ORDER BY records.trackid ASC; 
+1

這不起作用,因爲你需要'分鐘(時間)',但只有'最小(故障)' –

+0

感謝您的建議 – denny

+0

我編輯多數民衆議題是我的錯 – denny

2

使用變量創建一個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

+0

在我添加「WHERE records.userid = 1」後,這個功能完美無缺。 你能解釋一下你的意思嗎?「你可能有關係問題,不知道你想怎麼處理這些問題。謝謝。 –

+0

是的,我只是用它來修復它。當出現'userid = 3'時,查看圖像上的錯誤。在兩個不同的日期中,玩家在相同的軌道上獲得相同的錯誤和相同的時間的情況下的聯繫。你想顯示兩行,最早的,最新的? –

+0

用戶只能輸入改進的記錄,因此與現有記錄具有相同時間和故障的記錄不會被視爲改進,並且不能輸入:)感謝您指出了這一點。我可以看到這可能是一個問題。 –