выбрать уникальные строки на основе одного отдельного столбца - PullRequest
62 голосов
/ 26 ноября 2011

Я хочу выбрать строки, которые имеют 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 ]

85 голосов
/ 26 ноября 2011

Быстрый в 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;
30 голосов
/ 26 ноября 2011

Я предполагаю, что вы имеете в виду, что вам все равно, какая строка используется для получения значений 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
2 голосов
/ 09 июня 2016

Если вы используете MySql 5.7 или новее , то по этим ссылкам ( MySql Official , SO QA ), мы можем выбрать одну запись на group by без необходимости использования каких-либо агрегатных функций.

Таким образом, запрос может быть упрощен до этого.

select * from comments_table group by commentname;

Попробуйте запрос в действии здесь

2 голосов
/ 26 ноября 2011

Так как вам не важно, какой идентификатор возвращать, я придерживаюсь MAX id для каждого письма, чтобы упростить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...