从 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);

第二个有问题。尝试单独使用第一个,然后看看第二个是否有帮助。