#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