在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的常见问题