【问题标题】:How to get unique data in mysql 8.0 +如何在 mysql 8.0 + 中获取唯一数据
【发布时间】:2019-10-09 22:55:13
【问题描述】:

我正在尝试做一个简单的选择查询,它将过滤掉重复数据,就像在 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;

每一个选择查询都会失败,或者至少没有得到想要的结果。

我想获得一个唯一的commentOn 字段,因为有两个值为1。为了在 mysql 8.0 中获取唯一数据,正确的选择语句是什么?

【问题讨论】:

  • 您是说这些查询在 5.6 中有效,但在 8.0 中无效?你得到什么错误?到目前为止,您尝试过什么来解决问题?文档的哪些方面支持您的解决方案?

标签: mysql mysql-8.0


【解决方案1】:

您在错误的列上使用了聚合函数。您不要在分组依据的列上使用ANY_VALUE(),而是在并非由该列唯一确定的所有其他列上使用它。

SELECT ANY_VALUE(id) AS id, ANY_VALUE(comment) AS comment, commentonid
FROM Test
GROUP BY commentonid

请注意,这并不能保证 idcomment 将来自同一行。你可以得到

1  reply 2  1

结果。如果您想获得一致的一致行,通常应该指定一些条件来确定您希望在组中的哪一行,例如最高的id。请参阅SQL select only rows with max value on a column 了解如何编写此类查询。

【讨论】:

  • Barmar 我还有一个简单的问题。我将如何在 mysql 8 中进行双重分组。如果我在插入中添加另一列并将其命名为 PosterId 或 SharedCommentid,我将如何确保 commentonid 和(PosterId 或 SharedCommentid)都具有唯一数据?
  • GROUP BY commentonid, posterid 就像你一直拥有的一样
【解决方案2】:

感谢 Barmar 的回答。我喜欢你如何选择最简单、最容易理解的方式来回答问题,然后引用一个链接,该链接将为问题提供更具体的答案。使用您给我的链接,我能够更详细地了解获取不同的数据。补充您的答案,因为您指出您的示例不能保证不同的列将来自同一行。

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 来更改不同的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2021-10-09
    相关资源
    最近更新 更多