2014-11-02 2 views
0

У меня есть таблица под названием tbl_user_sal:функция MAX в MySQL не возвращает правильное значение ключа

| id | user_id | salary | date | 
| 1 | 1 | 1000 | 2014-12-01 | 
| 2 | 1 | 2000 | 2014-12-02 | 

Теперь я хочу, чтобы получить идентификатор максимальной даты. Я использовал следующий запрос:

SELECT MAX(date) AS from_date, id, user_id, salary 
FROM tbl_user_sal 
WHERE user_id = 1 

Но он дал мне этот выход:

| id | user_id | salary | from_date | 
| 1 | 1 | 2000 | 2014-12-02 | 

Который является правильным, насколько максимальной датой будучи 2014-12-02, но соответствующий идентификатор не является правильным. Это происходит и для других записей. Я использовал заказ, чтобы проверить, но это тоже не удалось. Может кто-нибудь пролить некоторый свет на это?

Примечание: не обязательно, чтобы максимальная дата имела максимальный id, в соответствии с моими потребностями. Записи могут иметь максимальную дату, но id может быть старше.

+0

В вашей таблице нет такого поля 'awrd_date', и результат не может быть тем, что вы сказали. –

+0

@ Begueradj благодарю вас за указание на ошибку, я изменил свой код. –

ответ

0

Если вы хотите, чтобы получить эту информацию для одного пользователя, который вы, кажется, из-за вашего пункта WHERE, просто используйте ORDER BY и LIMIT:

SELECT * 
FROM tbl_user_sal 
WHERE user_id = 1 
ORDER BY date DESC 
LIMIT 1 

Если вы хотите сделать это для каждого пользователя , однако вам придется немного поучаствовать. Что-то вроде этого должно сделать это:

SELECT t2.id, user_id, date 
--find max date for each user_id 
FROM (SELECT user_id, MAX(date) AS date 
     FROM tbl_user_sal 
     GROUP BY user_id) AS t1 
--join ids for each max date/user_id combo 
JOIN tbl_user_sal AS t2 
    USING (user_id, date) 
--limit to 1 id for every user_id 
GROUP BY 
    user_id 
0

Вы отсутствуете группы по статье Попробуйте это:

select max(awrd_date) as from_date,awrd_id 
from tbl_user_sal 
where awrd_user_id = 106 
group by awrd_id 
+0

Это не тот случай, когда 'max (awrd_date)' и 'awrd_id' будут из одной строки. – zerkms

+0

Я предполагаю, что OP нуждается в макс по дате, а не на обоих, говорит, что «1 1 2000 2014-12-02» верен по дате, но его идентификатор перепутался. Он ожидал, что это будет правильно. – SMA

+0

«Что правильно в смысле даты, так как« 2014-12-02 »является максимальным, но его соответствующий идентификатор неверен». --- Правильно, и ваш запрос также будет смешивать данные из разных строк. – zerkms

0

То, что я верю, что вы должны сделать здесь есть подзапрос, который тянет максимальную дату, и ваш внешний запрос ищет строку с этой датой.

Это выглядит следующим образом:

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

Дополнительные вещи, возможно, потребуется быть добавлены, если вы хотите найти конкретного user_id, или получить наибольшую дату для каждого user_id, но это дает свои ожидаемые результаты для этого пример здесь.

Описание: SQL Fiddle.