выбор уникальных строк на основе одного отдельного столбца


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

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;

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