MySQL получает MAX предыдущего условия WHERE - PullRequest
0 голосов
/ 04 марта 2010

У меня есть таблица:

  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)   
    )

Я бы не получил результата, так как идентификатор не отображается для самой последней даты.

Обновление

Феликс напомнил мне, что я не могу использовать агрегатные функции в предложении 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'
    )
)

Ответы [ 3 ]

1 голос
/ 04 марта 2010
SELECT score
  FROM table
 WHERE id = '$id'
   AND date > '2010-01-01'
 ORDER BY date DESC
 LIMIT 1

EDIT

Смотрите мой второй комментарий относительно интерпретаций:

Интерпретация 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 голос
/ 04 марта 2010

Не уверен в производительности этого:

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
0 голосов
/ 04 марта 2010

Используйте этот запрос:

SELECT * FROM test
WHERE date = (
    SELECT MAX(date) FROM test
) ;

Если вы хотите на основе идентификатора, вам нужно выполнить группирование по операции со столбцом идентификатора

...