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;
我的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;