我有一个高分表,每天午夜由脚本更新。
表名:hiscores
+-------+-------+---------------------+
| user | score | time |
+-------+-------+---------------------+
| Bob | 100 | 2017-10-24 00:00:04 |
| Frank | 105 | 2017-10-24 00:00:05 |
| Ahmed | 44 | 2017-10-24 00:00:06 |
| Frank | 77 | 2017-10-25 00:00:04 |
| Bob | 101 | 2017-10-25 00:00:05 |
| Ahmed | 100 | 2017-10-25 00:00:06 |
+-------+-------+---------------------+
我希望返回今天得分最高的用户。
假设今天是2017-10-25,需要结果:
| Bob | 101 | 2017-10-25 00:00:05 |
最初我试过这个:
SELECT hs.time, hs.user, hs3.high_score
FROM `hiscores` AS hs
JOIN (SELECT MAX(hs2.score) AS high_score
FROM `hiscores` AS hs2
) AS hs3
ON hs.score = hs3.high_score
它返回了得分最高的一行 - 错误的日期/时间。
| Bob | 101 | 2017-10-25 00:00:04 |
然后我尝试了:
SELECT hs5.hs_time, hs.user, hs3.high_score
FROM `hiscores` AS hs
JOIN (SELECT MAX(hs2.score) AS high_score
FROM `hiscores` AS hs2
) AS hs3
ON hs.score = hs3.high_score
JOIN(SELECT hs4.time AS hs_time FROM `hiscores` AS hs4) AS hs5
ON DATE(hs5.hs_time) = DATE(NOW())
返回正确的用户和分数,但超过 3 行(所有时间)。
| Bob | 101 | 2017-10-25 00:00:04 |
| Bob | 101 | 2017-10-25 00:00:05 |
| Bob | 101 | 2017-10-25 00:00:06 |
我在两者之间尝试了很多东西,不仅仅是那两个,但它们是我最接近的尝试。我可以看到问题,但看不到如何解决它。
最佳答案
在这种情况下,你不需要使用join。只需按照这个例子:
SELECT
user, score, time
FROM `hiscores`
WHERE
DATE(time)=CURDATE() AND
score=(SELECT MAX(score) FROM `hiscores` WHERE DATE(time)=CURDATE())
关于mySQL 自连接表以在今天的日期从 max(column) 中查找单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46923415/