在MySQL中获取最新记录

在MySQL中获取最新记录,mysql,max,Mysql,Max,我有这张有员工合同记录的表 +----+---------------------------+ | id | start| end | employee | +----+---------------------------+ | 8 | 2016 | 2017 | 777 | | 7 | 2014 | 2015 | 777 | | 6 | 2012 | 2013 | 777 | | 5 | 2010 | 2011 | 77

我有这张有员工合同记录的表

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

但是这给了我一个与记录不对应的id

不要使用
group by
。要过滤行,请使用
where
——在本例中,使用某种子查询

这里有一种方法:

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

不要为此使用
分组依据
。要过滤行,请使用
where
——在本例中,使用某种子查询

这里有一种方法:

SELECT c.*
FROM contract c
WHERE c.id (SELECT MAX(c2.id)
            FROM contract c2
            WHERE c2.employee = c.employee
           );
以下是一项建议:

SELECT t.*
FROM test t
WHERE t.start in (SELECT MAX(t2.start)
            FROM test t2
            group by t2.employee
           );
和SQLFiddle这里有一个建议:

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

和SQLFiddle创建表/插入数据

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
    id   start  employee  
------  ------  ----------
     3    2016         666
     8    2016         777
完成查询

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)
现在,在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  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
    id   start  employee  
------  ------  ----------
     3    2016         666
     8    2016         777

创建表格/插入数据

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
    id   start  employee  
------  ------  ----------
     3    2016         666
     8    2016         777
完成查询

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)
现在,在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  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
    id   start  employee  
------  ------  ----------
     3    2016         666
     8    2016         777

这是mysql和GroupBy的常见问题这是mysql和GroupBy的常见问题