从 mysql 中的分组条件中获取最后一行
Get the last row with condition from group by in mysql
我绞尽脑汁想知道如何在 MySQL 5.6 中按列检索每个组的最后一行,该行与特定值相匹配。例如:
CREATE TABLE `djs` (
`dj_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `djs` (`dj_id`, `name`) VALUES
(1, 'Jack'),
(2, 'Sam');
CREATE TABLE `shows` (
`show_id` int(11) NOT NULL,
`dj_id` int(11) NOT NULL,
`show_active` tinyint(1) DEFAULT '1',
`show_started` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`show_ended` timestamp NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `shows` (`show_id`, `dj_id`, `show_active`, `show_started`, `show_ended`) VALUES
(1, 1, 1, '2020-06-07 12:05:41', '2020-06-07 14:44:48'),
(2, 2, 1, '2020-06-07 12:05:41', '2020-06-07 14:55:48'),
(4, 1, 0, '2020-06-07 15:43:50', '2020-06-07 15:43:50'),
(5, 2, 1, '2020-06-07 15:58:51', '2020-06-07 16:00:51'),
(6, 2, 0, '2020-06-07 16:01:51', '2020-06-07 16:34:51');
假设我将 table 按 dj_id 分组,因此,在这种情况下,我们将有 2 行(来自 dj_id 的第 1 行和第 2 行) .
我想知道我应该使用什么查询来获取每个 dj_id 的最后一行 show_active 设置为 1(或 true),所以结果将是这样的:
show_id x dj_id x show_active x show_started
1 x 1 x 1 x 2020-06-07 12:05:41
5 x 2 x 1 x 2020-06-07 15:58:51
编辑:提供 an SQLFiddle 来说明 table。
您可以使用子查询来查找所需的行。例如:
select *
from `shows`
where (`dj_id`, `show_started`) in (
select `dj_id`, max(`show_started`)
from `shows`
where `show_active` = 1
group by `dj_id`
)
参见 DB Fiddle 中的 运行 示例。
性能编辑:
如果查询速度慢,可能是正确的索引没有到位。我会尝试创建以下索引:
create index ix1 on shows (show_active, dj_id, show_started);
create index ix2 on shows (dj_id, show_started);
第二个有问题。尝试单独使用第一个,然后看看第二个是否有帮助。
我绞尽脑汁想知道如何在 MySQL 5.6 中按列检索每个组的最后一行,该行与特定值相匹配。例如:
CREATE TABLE `djs` (
`dj_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `djs` (`dj_id`, `name`) VALUES
(1, 'Jack'),
(2, 'Sam');
CREATE TABLE `shows` (
`show_id` int(11) NOT NULL,
`dj_id` int(11) NOT NULL,
`show_active` tinyint(1) DEFAULT '1',
`show_started` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`show_ended` timestamp NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `shows` (`show_id`, `dj_id`, `show_active`, `show_started`, `show_ended`) VALUES
(1, 1, 1, '2020-06-07 12:05:41', '2020-06-07 14:44:48'),
(2, 2, 1, '2020-06-07 12:05:41', '2020-06-07 14:55:48'),
(4, 1, 0, '2020-06-07 15:43:50', '2020-06-07 15:43:50'),
(5, 2, 1, '2020-06-07 15:58:51', '2020-06-07 16:00:51'),
(6, 2, 0, '2020-06-07 16:01:51', '2020-06-07 16:34:51');
假设我将 table 按 dj_id 分组,因此,在这种情况下,我们将有 2 行(来自 dj_id 的第 1 行和第 2 行) .
我想知道我应该使用什么查询来获取每个 dj_id 的最后一行 show_active 设置为 1(或 true),所以结果将是这样的:
show_id x dj_id x show_active x show_started
1 x 1 x 1 x 2020-06-07 12:05:41
5 x 2 x 1 x 2020-06-07 15:58:51
编辑:提供 an SQLFiddle 来说明 table。
您可以使用子查询来查找所需的行。例如:
select *
from `shows`
where (`dj_id`, `show_started`) in (
select `dj_id`, max(`show_started`)
from `shows`
where `show_active` = 1
group by `dj_id`
)
参见 DB Fiddle 中的 运行 示例。
性能编辑:
如果查询速度慢,可能是正确的索引没有到位。我会尝试创建以下索引:
create index ix1 on shows (show_active, dj_id, show_started);
create index ix2 on shows (dj_id, show_started);
第二个有问题。尝试单独使用第一个,然后看看第二个是否有帮助。