выбор уникальных строк на основе одного отдельного столбца
Я хочу выбрать строки, которые имеют distinct email
см. пример таблицы ниже:
+----+---------+-------------------+-------------+
| id | title | email | commentname |
+----+---------+-------------------+-------------+
| 3 | test | rob@hotmail.com | rob |
| 4 | i agree | rob@hotmail.com | rob |
| 5 | its ok | rob@hotmail.com | rob |
| 6 | hey | rob@hotmail.com | rob |
| 7 | nice! | simon@hotmail.com | simon |
| 8 | yeah | john@hotmail.com | john |
+----+---------+-------------------+-------------+
желаемый результат будет такой:
+----+-------+-------------------+-------------+
| id | title | email | commentname |
+----+-------+-------------------+-------------+
| 3 | test | rob@hotmail.com | rob |
| 7 | nice! | simon@hotmail.com | simon |
| 8 | yeah | john@hotmail.com | john |
+----+-------+-------------------+-------------+
где мне все равно, что id
возвращается значение столбца.
Каким будет требуемый SQL?
4 ответа:
быстрый один в TSQL
SELECT a.* FROM emails a INNER JOIN (SELECT email, MIN(id) as id FROM emails GROUP BY email ) AS b ON a.email = b.email AND a.id = b.id;
Я предполагаю, что вы имеете в виду, что вам все равно, какая строка используется для получения
title
,id
иcommentname
значения (у вас есть "rob" для всех строк, но я не знаю, действительно ли это то, что будет применено или нет в вашей модели данных). Если это так, то вы можете использовать оконные функции для возврата первой строки для данного адреса электронной почты:select id, title, email, commentname from ( select *, row_number() over (partition by email order by id) as RowNbr from YourTable ) source where RowNbr = 1
поскольку вам все равно, какой идентификатор возвращать, я придерживаюсь максимального идентификатора для каждого письма, чтобы упростить SQL-запрос, попробуйте
;WITH ue(id) AS ( SELECT MAX(id) FROM table GROUP BY email ) SELECT * FROM table t INNER JOIN ue ON ue.id = t.id
Если вы используете MySql 5.7 или более поздней версии, согласно этим ссылкам (Официальный MySql, ТАК QA), мы можем выбрать одну запись за
group by
без каких-либо агрегатных функций.Так что запрос может быть упрощен до этого.
select * from comments_table group by commentname;
попробуйте запрос в действиях здесь