MySQL 查询以根据条件对最后两个结果进行分组和排序

MySQL query to group and sort last two results based on criteria

我的table是这样的。人访问英国或美国。我需要一个人最后一次访问英国和美国的时间。所以每个人根据 desc

的日期顺序在期望的输出中只有两条记录
name     visited            vdate
----------------------------------------------------
A     UK (Scotland)         2020-05-12 12:00:10
B     USA (Mexico)          2020-07-23 05:14:59
A     UK (England)          2020-06-01 12:00:13
A     UK (Canada)           2020-06-18 16:20:47
B     USA (Mexico)          2020-05-05 12:54:56
C     USA (Peru)            2020-05-26 10:49:24
A     USA (Chile)           2020-06-12 07:15:18
B     UK (Northern Ireland) 2020-06-24 13:08:28
C     UK (Wales)            2020-06-22 00:43:22
C     USA (Cuba)            2020-05-22 03:37:23
B     UK (Wales)            2020-05-12 12:00:10
A     USA (Venezuela)       2020-05-14 14:41:35
C     USA (Peru)            2020-06-02 02:20:01

期望的结果

A    UK         2020-06-24 13:08:28
A    USA        2020-06-12 07:15:18
B    UK         2020-06-24 13:08:28
B    USA        2020-07-23 05:14:59 
C    UK         2020-06-22 00:43:22
C    USA        2020-06-02 02:20:01

我试过这样,但每人有 2 条记录,但可能不是一个英国和一个美国

select * from placetbl tbl
 where (SELECT COUNT(*) FROM placetbl tbl1 WHERE tbl1.name = tbl.name AND tbl1.vdate >= tbl.vdate) <= 2 ;

为此你可以使用 GROUP BY and MAX of the date, for the Countries you ca use SUBSTRING_INDEX

CREATE TABLE placetbl  (
  `name` VARCHAR(1),
  `visited` VARCHAR(41),
  `vdate` Datetime
);
INSERT INTO placetbl 
  (`name`, `visited`, `vdate`)
VALUES
  ('A', 'UK (Scotland)', '2020-05-12 12:00:10'),
  ('B', 'USA (Mexico)', '2020-07-23 05:14:59'),
  ('A', 'UK (England)', '2020-06-01 12:00:13'),
  ('A', 'UK (Canada)', '2020-06-18 16:20:47'),
  ('B', 'USA (Mexico)', '2020-05-05 12:54:56'),
  ('C', 'USA (Peru)', '2020-05-26 10:49:24'),
  ('A', 'USA (Chile)', '2020-06-12 07:15:18'),
  ('B', 'UK (Northern Ireland)','2020-06-24 13:08:28'),
  ('C', 'UK (Wales)', '2020-06-22 00:43:22'),
  ('C', 'USA (Cuba)', '2020-05-22 03:37:23'),
  ('B', 'UK (Wales)', '2020-05-12 12:00:10'),
  ('A', 'USA (Venezuela)', '2020-05-14 14:41:35'),
  ('C', 'USA (Peru)', '2020-06-02 02:20:01');
SELECT `name`, SUBSTRING_INDEX(`visited`,' ',1) visited, MAX(`vdate`) vdate 
FROM placetbl 
GROUP BY `name`, SUBSTRING_INDEX(`visited`,' ',1)
ORDER BY NAME, SUBSTRING_INDEX(`visited`,' ',1)
name | visited | vdate              
:--- | :------ | :------------------
A    | UK      | 2020-06-18 16:20:47
A    | USA     | 2020-06-12 07:15:18
B    | UK      | 2020-06-24 13:08:28
B    | USA     | 2020-07-23 05:14:59
C    | UK      | 2020-06-22 00:43:22
C    | USA     | 2020-06-02 02:20:01

db<>fiddle here

先取正确的国名再分组

SELECT MAX(VDATE), NAME, VISITED FROM (
SELECT SUBSTRING_INDEX(visited,' ',1) VISITED, VDATE, NAME FROM TABLE1) A
GROUP BY NAME, VISITED;