Подтвердить что ты не робот

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

Я хочу выбрать строки с distinct email, см. таблицу ниже:

+----+---------+-------------------+-------------+
| id | title   | email             | commentname |
+----+---------+-------------------+-------------+
|  3 | test    | [email protected]   | rob         |
|  4 | i agree | [email protected]   | rob         |
|  5 | its ok  | [email protected]   | rob         |
|  6 | hey     | [email protected]   | rob         |
|  7 | nice!   | [email protected] | simon       |
|  8 | yeah    | [email protected]  | john        |
+----+---------+-------------------+-------------+

Желаемый результат:

+----+-------+-------------------+-------------+
| id | title | email             | commentname |
+----+-------+-------------------+-------------+
|  3 | test  | [email protected]   | rob         |
|  7 | nice! | [email protected] | simon       |
|  8 | yeah  | [email protected]  | john        |
+----+-------+-------------------+-------------+

Мне не важно, какое значение столбца id будет возвращено. Каким будет необходимый SQL?

4b9b3361

Ответ 1

Быстрый в 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;

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

select * from comments_table group by commentname;

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