如何在 mysql 8.0 + 中获取唯一数据
How to get unique data in mysql 8.0 +
我正在尝试做一个简单的 select 查询,它将过滤掉重复数据,就像在 5.6 以下的 mysql 版本中可能实现的那样。
我在网上做了很多研究,我已经尝试了所有我发现的东西,但我似乎仍然不明白要点。
CREATE TABLE Test (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
Comment text,
commentOnId int(11) DEFAULT NULL,
Time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into test (comment, commentonid)
VALUES
('My first comment', null),
('reply 1',1),
('reply 2',1);`
select id, comment, commentonid from Test group by commentonid;
select id, comment, distinct commentonid from Test group by commentonid;
select id, comment, distinct commentonid from Test;
select id, comment, ANY_VALUE(commentonid) as unique from Test group by unique;
select id, comment, distinct ANY_VALUE(commentonid) from Test;`
`select id, comment, MIN(commentonid) from Test;
select 个查询中的每一个都失败了,或者至少没有得到想要的结果。
我想要一个唯一的 commentOn
字段,因为有两个字段的值为 1
。为了在 mysql 8.0 中获取唯一数据,正确的 select 语句是什么?
您在错误的列上使用了聚合函数。您不在分组依据的列上使用 ANY_VALUE()
,而是在并非由该列唯一确定的所有 other 列上使用它。
SELECT ANY_VALUE(id) AS id, ANY_VALUE(comment) AS comment, commentonid
FROM Test
GROUP BY commentonid
请注意,这并不能保证 id
和 comment
会来自同一行。你可以获得
1 reply 2 1
作为结果。如果你想得到一个一致的行,你通常应该指定一些你想要在组中的行的标准,比如最高的id
。有关如何编写此类查询,请参阅 SQL select only rows with max value on a column。
谢谢 Barmar 的回答。我喜欢你如何选择最简单和最容易理解的方式来回答问题,然后引用 link 来给出更具体的问题答案。使用你给我的link,我能够更详细地了解获取不同的数据。添加到您的答案,因为您注意到您的示例不能保证不同的列将来自同一行。
SELECT id AS aid, comment AS acomment, commentonid as acommentonid
FROM Test as a inner join (SELECT Max(id) AS bid
FROM Test
GROUP BY commentonid) as b ON a.id = b.bid;
内部联接最适合特定条件,因为它使您能够在内部执行一大堆不同的功能。它还将确保列来自同一行,因为可以通过更改连接中的 id as bid
来简单地更改不同的行。
我正在尝试做一个简单的 select 查询,它将过滤掉重复数据,就像在 5.6 以下的 mysql 版本中可能实现的那样。
我在网上做了很多研究,我已经尝试了所有我发现的东西,但我似乎仍然不明白要点。
CREATE TABLE Test (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
Comment text,
commentOnId int(11) DEFAULT NULL,
Time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into test (comment, commentonid)
VALUES
('My first comment', null),
('reply 1',1),
('reply 2',1);`
select id, comment, commentonid from Test group by commentonid;
select id, comment, distinct commentonid from Test group by commentonid;
select id, comment, distinct commentonid from Test;
select id, comment, ANY_VALUE(commentonid) as unique from Test group by unique;
select id, comment, distinct ANY_VALUE(commentonid) from Test;`
`select id, comment, MIN(commentonid) from Test;
select 个查询中的每一个都失败了,或者至少没有得到想要的结果。
我想要一个唯一的 commentOn
字段,因为有两个字段的值为 1
。为了在 mysql 8.0 中获取唯一数据,正确的 select 语句是什么?
您在错误的列上使用了聚合函数。您不在分组依据的列上使用 ANY_VALUE()
,而是在并非由该列唯一确定的所有 other 列上使用它。
SELECT ANY_VALUE(id) AS id, ANY_VALUE(comment) AS comment, commentonid
FROM Test
GROUP BY commentonid
请注意,这并不能保证 id
和 comment
会来自同一行。你可以获得
1 reply 2 1
作为结果。如果你想得到一个一致的行,你通常应该指定一些你想要在组中的行的标准,比如最高的id
。有关如何编写此类查询,请参阅 SQL select only rows with max value on a column。
谢谢 Barmar 的回答。我喜欢你如何选择最简单和最容易理解的方式来回答问题,然后引用 link 来给出更具体的问题答案。使用你给我的link,我能够更详细地了解获取不同的数据。添加到您的答案,因为您注意到您的示例不能保证不同的列将来自同一行。
SELECT id AS aid, comment AS acomment, commentonid as acommentonid
FROM Test as a inner join (SELECT Max(id) AS bid
FROM Test
GROUP BY commentonid) as b ON a.id = b.bid;
内部联接最适合特定条件,因为它使您能够在内部执行一大堆不同的功能。它还将确保列来自同一行,因为可以通过更改连接中的 id as bid
来简单地更改不同的行。