MySQL获得前一个WHERE条件的MAX

时间:2010-03-04 08:10:34

标签: mysql subquery aggregate

我有一张桌子:

  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功能时指定用户吗?

更新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'
    )
)

3 个答案:

答案 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列

进行分组操作