3 回答

TA貢獻1818條經驗 獲得超8個贊
最快的MySQL解決方案,沒有內部查詢,沒有GROUP BY:
SELECT m.* -- get the row that contains the max value
FROM topten m -- "m" from "max"
LEFT JOIN topten b -- "b" from "bigger"
ON m.home = b.home -- match "max" row with "bigger" row by `home`
AND m.datetime < b.datetime -- want "bigger" than "max"
WHERE b.datetime IS NULL -- keep only if there is no bigger than max
說明:
使用home列加入表格。使用LEFT JOIN確保表m中的所有行都出現在結果集中。那些在表中沒有匹配的那些b將具有NULLs的列b。
要求的另一個條件是JOIN僅匹配列b中具有更大值datetime的行而不是來自行的行m。
使用問題中發布的數據,LEFT JOIN將產生這樣的對:
+------------------------------------------+--------------------------------+
| the row from `m` | the matching row from `b` |
|------------------------------------------|--------------------------------|
| id home datetime player resource | id home datetime ... |
|----|-----|------------|--------|---------|------|------|------------|-----|
| 1 | 10 | 04/03/2009 | john | 399 | NULL | NULL | NULL | ... | *
| 2 | 11 | 04/03/2009 | juliet | 244 | NULL | NULL | NULL | ... | *
| 5 | 12 | 04/03/2009 | borat | 555 | NULL | NULL | NULL | ... | *
| 3 | 10 | 03/03/2009 | john | 300 | 1 | 10 | 04/03/2009 | ... |
| 4 | 11 | 03/03/2009 | juliet | 200 | 2 | 11 | 04/03/2009 | ... |
| 6 | 12 | 03/03/2009 | borat | 500 | 5 | 12 | 04/03/2009 | ... |
| 7 | 13 | 24/12/2008 | borat | 600 | 8 | 13 | 01/01/2009 | ... |
| 8 | 13 | 01/01/2009 | borat | 700 | NULL | NULL | NULL | ... | *
+------------------------------------------+--------------------------------+
最后,該WHERE子句僅保留NULL在列中具有s的對b(它們*在上表中標記); 這意味著,由于該JOIN子句的第二個條件,從中選擇的行在列中m具有最大值datetime。
閱讀SQL Antipatterns:避免數據庫編程的陷阱,以獲取其他SQL技巧。
添加回答
舉報