MySQL запрос не совсем правильный ... вероятно, довольно простой - PullRequest
1 голос
/ 25 июня 2011

У меня есть таблица для системы начисления заработной платы с четырьмя полями и некоторыми примерами данных:

pkref  employee_id  new_wage  effective_date
=====  ===========  ========  ==============
23     06031-BOB    10        080101
37     06031-BOB    15        090501
90     06031-BOB    13        110228 

При изменении заработной платы сотрудника ссылка на первичный ключ автоматически увеличивается, и соответствующая информация записывается (effective_date - это отметка времени, ггмдд). Там нет проблем.

Теперь я пытаюсь найти запрос для поиска

  1. Все записи, относящиеся к сотруднику, затем
  2. Максимальная отметка effective_date в этих подпунктах
  3. Заработная плата, соответствующая этому максимуму.

Я сделал свой самый первый подзапрос (!), Получил его почти правильно, но он глючит. Может ли какой-нибудь гуру взглянуть и толкнуть меня в правильном направлении?

SELECT MAX(effective_date),new_wage FROM (SELECT effective_date,new_wage FROM hr_wages WHERE employee_code='06031-BOB') AS t1

В идеале я хочу, чтобы 110228 и 13 были возвращены. Но, как вышеупомянутый гуру, несомненно, сразу увидит, что-то не так. Значение new_wage не всегда соответствует максимальному effective_date.

Итак. Чан делать?

Ответы [ 3 ]

3 голосов
/ 25 июня 2011

Подожди, что тебе мешает делать следующее?

select effective_date, new_wage from hr_wages
where employee_code = '06031-BOB'
order by effective_date desc
limit 1
1 голос
/ 25 июня 2011

Только для одного сотрудника вы можете использовать IN с подзапросом

   SELECT new_wage, other data... 
    FROM hr_wages
    WHERE effective_date IN (SELECT max(effective_date) FROM hr_wages WHERE employee_code='06031-BOB')
AND employee_code='06031-BOB' -- Corrected: Credits to Stev

e

Для всех сотрудников

SELECT new_wage, CO 
FROM hr_wages w LEFT JOIN
(SELECT max(effective_date) effective_date, employee_code 
FROM hr_wages 
GROUP BY employee_code
)d ON w.employee_code = d.employee.code AND w.effective_date = d.effective_date
0 голосов
/ 25 июня 2011

От @niktrs было сообщение с правильным ответом, но оно было удалено!

Итак, вот запрос, который я искал, с помощью @niktrs.Если его сообщение вернется, я приму его.

SELECT new_wage FROM hr_wages WHERE effective_date IN 
(SELECT effective_date,new_wage FROM hr_wages  WHERE employee_code='06031-BOB') 
AND employee_code='06031-BOB'

Это безобразие можно украсить, я уверен.

...