由于动态别名,您需要 dynamuc sql 进行此类查询
CREATE TABLE table1 (
`id` INTEGER,
`user_id` INTEGER,
`level` INTEGER,
`date_created` varchaR(24)
);
INSERT INTO table1
(`id`, `user_id`, `level`, `date_created`)
VALUES
('1', '1', '2', '2019-07-01T18:53:41.000Z'),
('2', '1', '3', '2020-07-01T18:53:41.000Z'),
('3', '1', '4', '2021-07-01T18:53:41.000Z'),
('4', '2', '2', '2020-07-01T18:53:41.000Z');
SET @column_alias1 := CONCAT('level_',YEAR(NOW() - INTERVAL 3 Year));
SET @column_alias2 := CONCAT('level_',YEAR(NOW() - INTERVAL 2 Year));
SET @column_alias3 := CONCAT('level_',YEAR(NOW() - INTERVAL 1 Year));
SET @query := CONCAT('SELECT `user_id`,
MIN( IF (YEAR(CAST(`date_created` AS DATETIME)) = YEAR( NOW() - INTERVAL 3 YEAR), `level`,NULL)) as `', @column_alias1, '`
,MIN( IF (YEAR(CAST(`date_created` AS DATETIME)) = YEAR( NOW() - INTERVAL 2 YEAR), `level`,NULL)) as `', @column_alias2, '`
,MIN( IF (YEAR(CAST(`date_created` AS DATETIME)) = YEAR( NOW() - INTERVAL 1 YEAR), `level`,NULL)) as `', @column_alias3, '`
FROM table1
GROUP BY `user_id`');
PREPARE dynamic_statement FROM @query;
EXECUTE dynamic_statement
用户 ID | level_2019 | level_2020 | level_2021
------: | ---------: | ---------: | ---------:
1 | 2 | 3 | 4
2 | 空 | 2 | 空
db小提琴here