Как получить уникальные данные в MySQL 8.0 + - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь выполнить простой запрос на выборку, который отфильтровывает дублирующиеся данные, как это было возможно в версиях mysql ниже 5.6.

Я провел много исследований в Интернете и перепробовал все, что янашел, но я все еще не понимаю суть.

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. Как правильно использовать оператор select для получения уникальных данных в MySQL 8.0?

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Спасибо, Бармар, за ваш ответ. Мне нравится, как вы выбрали самый простой и понятный способ ответа на вопрос, а затем сослались на ссылку, которая даст более конкретный ответ на вопрос. Используя ссылку, которую вы дали мне, я смог получить еще более глубокое понимание получения различных данных. добавьте к своему ответу, как вы отметили, что ваш пример не гарантирует, что разные столбцы будут приходить из одной строки.

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 в соединении.

0 голосов
/ 10 октября 2019

Вы используете функцию агрегирования в неправильном столбце. Вы не используете ANY_VALUE() для столбца, по которому вы группируете, вы используете его для всех других столбцов, которые не определяются этим столбцом однозначно.

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, выбирающий только строки с максимальным значением в столбце , чтобы узнать, как писать такие запросы.

...