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技巧。
添加回答
举报