mySQL 自连接表以在今天的日期从 max(column) 中查找单行

标签 mysql join

我有一个高分表,每天午夜由脚本更新。

表名: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/

相关文章:

mysql - cakephp 加入选择框

php - 如何在单个数组中获取 php PDO QUERY 结果集而不是嵌套在一个数组中

mysql - 从同一查询生成多个总和

asp.net - 如何在服务器群中实现锁定?

c# - 在 C# 中,如何避免引号中断

mysql - 这个 MySql 连接字符串有什么问题

MySQL SELECT 两个表,同时用第二个表的字段值替换第一个表的字段值

mysql - Left Join + count + MySQL 求和

php - 提交表单后显示错误信息

php - 通过 php 提交框运行多个 Mysql 更新