2017-01-20 22 views
0

У меня есть эта таблица с отчетами о контрактах с сотрудником.Получить последнюю запись в MySQL

+----+---------------------------+ 
| id | start| end  | employee | 
+----+---------------------------+ 
| 8 | 2016 | 2017 | 777  | 
| 7 | 2014 | 2015 | 777  | 
| 6 | 2012 | 2013 | 777  | 
| 5 | 2010 | 2011 | 777  | 
| 3 | 2016 | 2017 | 666  | 
| 4 | 2014 | 2015 | 666  | 
| 2 | 2012 | 2013 | 666  | 
| 1 | 2010 | 2011 | 666  | 
+----+---------------------------+ 

У меня возникли трудности с получением последнего контракта на сотрудника.

Запрос должен напечатать:

+----+-----------------+ 
| id | start| employee | 
+----+-----------------+ 
| 8 | 2016 | 777  | 
| 3 | 2016 | 666  | 
+----+-----------------+ 

я пытался до сих пор:

SELECT 
MAX(start) 
,id 
,employee 
FROM contract 
GROUP BY employee 

, но это дает мне идентификатор, что не соответствует записи.

+0

Это общий вопрос для MySQL и группы по http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each -группа –

ответ

1

Не используйте для этого group by. Вы хотите отфильтровать строки, поэтому используйте where - в этом случае с каким-то подзапросом.

Вот один из методов:

SELECT c.* 
FROM contract c 
WHERE c.id (SELECT MAX(c2.id) 
      FROM contract c2 
      WHERE c2.employee = c.employee 
      ); 
1

Вот предложение:

SELECT t.* 
FROM test t 
WHERE t.start in (SELECT MAX(t2.start) 
      FROM test t2 
      group by t2.employee 
      ); 

и SQLFiddle LINK

1

CREATE данные таблицы/вставки

CREATE TABLE contract 
    (`id` INT, `start` INT, `end` INT, `employee` INT) 
; 

INSERT INTO contract 
    (`id`, `start`, `end`, `employee`) 
VALUES 
    (8, 2016, 2017, 777), 
    (7, 2014, 2015, 777), 
    (6, 2012, 2013, 777), 
    (5, 2010, 2011, 777), 
    (3, 2016, 2017, 666), 
    (4, 2014, 2015, 666), 
    (2, 2012, 2013, 666), 
    (1, 2010, 2011, 666) 
; 

Используйте переменные пользователя, чтобы отметить максимальную цену для каждого сгруппированного сотрудника.

Пользовательские переменные запроса

SELECT 
    contract.id 
    , contract.start 
    , contract.employee 
    , (contract.employee != @employee) AS employeeMax -- Mark a new employee as Max 
    , (@employee := contract.employee) AS employeeInit 
    FROM 
    contract 
    ORDER BY 
     contract.employee 
    , contract.start DESC -- DESC for MAX(start) ASC for MIN(start) 

Результат

id start employee employeeMax employeeInit 
------ ------ -------- ----------- -------------- 
    3 2016  666   1    666 
    4 2014  666   0    666 
    2 2012  666   0    666 
    1 2010  666   0    666 
    8 2016  777   1    777 
    7 2014  777   0    777 
    6 2012  777   0    777 
    5 2010  777   0    777 

полного запроса

Теперь фильтр на employeeMax = 1, чтобы только сохранить самые большие ценовые рекорды, как это.

SELECT 
    contract_group.id 
, contract_group.start 
, contract_group.employee 
FROM (
    SELECT 
    contract.id 
    , contract.start 
    , contract.employee 
    , (contract.employee != @employee) AS employeeMax -- Mark a new employee as Max 
    , (@employee := contract.employee) AS employeeInit 
    FROM 
    contract 
    ORDER BY 
     contract.employee 
    , contract.start DESC -- DESC for MAX(start) ASC for MIN(start) 
) 
AS 
    contract_group 
WHERE 
contract_group.employeeMax = 1 -- keep only the employee max marked records 

Результат

id start employee 
------ ------ ---------- 
    3 2016   666 
    8 2016   777 
Смежные вопросы