我有一张桌子:
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子句中说“最近日期”,如果是,如果是我可以在使用THAT功能时指定用户吗?
所以这就是我的工作,但我仍然不知道这是否是最佳方式(即,我是否需要嵌套查询?):
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'
)
)
答案 0 :(得分:1)
SELECT score
FROM table
WHERE id = '$id'
AND date > '2010-01-01'
ORDER BY date DESC
LIMIT 1
修改强>
请参阅我关于解释的第二条评论:
解释1:
SELECT score
FROM table
WHERE id = '$id'
AND date >= '2010-01-01'
ORDER BY date ASC
LIMIT 1
解释2:
SELECT score,
LEAST(ABS(DATEDIFF('2010-01-01', date)), 1) AS myorder
FROM table
WHERE id = '$id'
AND date >= '2010-01-01'
ORDER BY myorder ASC, date DESC
LIMIT 1
答案 1 :(得分:1)
不确定这个的表现:
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
答案 2 :(得分:0)
使用此查询:
SELECT * FROM test
WHERE date = (
SELECT MAX(date) FROM test
) ;
如果你想根据id,你需要按id列
进行分组操作