我有一张 table :
id | score | date
bob | 40 | 2010-1-1
bob | 70 | 2010-1-15
sue | 55 | 2010-1-1
sue | 80 | 2010-2-1
我想查询某个用户在特定日期的分数,或者如果该用户在该日期不存在分数,则返回该用户最近日期的分数。
有没有办法在没有子查询的情况下做到这一点?
例如,如果我这样做:
SELECT score
FROM table
WHERE id = '$id'
AND IFNULL(
date = DATE(FROM_UNIXTIME($date)),
MAX(date)
)
我不会得到任何结果,因为最近的日期没有显示 ID。
更新
Felix 提醒我不能在 WHERE 子句中使用聚合函数,所以现在我想知道是否有一个伪聚合日期函数用于在 where 子句中表示“最近日期”,如果有,如果我可以在使用该功能时指定用户吗?
更新2
这就是我要做的工作,但我仍然不知道这是否是最好的方法(即,我需要嵌套查询吗?):
SELECT score
FROM table
WHERE id = '$id'
AND date = IFNULL(
(SELECT date FROM table
WHERE id = '$id' AND
date = DATE(FROM_UNIXTIME($date))
),
(SELECT MAX(date) FROM table
WHERE id = '$id'
)
)
最佳答案
不确定这个的性能:
SELECT a.*
FROM table a
LEFT JOIN table b ON (
b.date=DATE(FROM_UNIXTIME($date)) AND b.date=a.date AND b.id=a.id
)
WHERE a.id='$id'
ORDER BY b.date DESC, a.date DESC
LIMIT 1
关于MySQL 获取先前 WHERE 条件的 MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377697/