Как избежать дублирования записей в запросе ЛЕВОГО СОЕДИНЕНИЯ?

#mysql #sql #database #join

#mysql #sql #База данных #Присоединиться

Вопрос:

У меня есть следующие таблицы:

 CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(40) NOT NULL,
  PRIMARY KEY (id)
  );
  
 id | name    
---|-------------
 1 | John
 2 | Franck
 3 | Peter
...
  
 CREATE TABLE emails (
  iduser INT NOT NULL,
  email VARCHAR(40) NOT NULL,
  PRIMARY KEY (iduser, email),
  );
ALTER TABLE emails 
ADD FOREIGN KEY (iduser)
REFERENCES users (id) ON DELETE CASCADE;
  
 iduser | email
-------|---------------
     1 | john@hotmail.com
     1 | john@other.com
     2 | franck@gmail.com
...
  

Мне нужно получить следующий результат:

 id | Name   | Email
---|--------|----
 2 | Franck | franck@gmail.com (just one of the two)
 1 | John   | john@hotmail.com
 3 | Peter  |
  

Использование

 SELECT users.id, users.name, emails.email
  FROM users LEFT JOIN emails ON emails.iduser = users.id
  ORDER BY users.name
  

возвращает обе строки John, но мне нужна только одна из них (а также мне нужны строки, в которых нет соответствующего адреса электронной почты). Как это можно сделать с помощью одного запроса?

Комментарии:

1. просто добавьте group by users.name перед заказом по

Ответ №1:

Предполагая, что вам все равно, какое электронное письмо возвращается.

 SELECT users.id, users.name, max(emails.email)
FROM users 
 LEFT JOIN emails ON emails.iduser = users.id
GROUP by user.id, users.name
ORDER BY users.name
  

Ответ №2:

 SELECT users.id, users.name, MAX(emails.email) AS Email
  FROM users 
  LEFT JOIN emails ON emails.iduser = users.id
GROUP BY users.id
ORDER BY users.name
  

Ответ №3:

Добавить DISTINCT , чтобы возвращать уникальные строки и emails.email IS NULL :

 SELECT DISTINCT users.id, users.name, emails.email
FROM users LEFT JOIN emails ON emails.iduser = users.id
WHERE emails.email IS NULL
ORDER BY users.name