Создание запроса выборки (mysql)

Помогите составить запрос.
Есть таблица mails в которой есть два поля email и status
В Таблице есть 5 строк

Email1 status1
Email2 status1
Email3 status1
Email1 status2
Email2 status2


То есть, как мы видим у Email1 и Email2 имеется по две записи с разными статусами.
Нужно составить запрос который бы делал выборку из этой таблицы и возвращал нам только емаилы со статусом 1, которых нету в таблице со статусом 2
То есть в нашем случае это была бы единственная запись — Email3
  • Вопрос задан
  • 3890 просмотров
Пригласить эксперта
Ответы на вопрос 5
FreeTibet
@FreeTibet
dharma supplier

SELECT m1.*
FROM mails AS m1
LEFT JOIN mails AS m2 
	ON m1.email = m2.email AND m2.`status` = 'status2'
WHERE 
	m1.`status` = 'status1' 
	AND m2.email IS NULL
Ответ написан
Комментировать
FreeTibet
@FreeTibet
dharma supplier
А вот маленькое извращение, за которые мы все так любим SQL:

SELECT email, `status` FROM (
	SELECT email, `status`, COUNT(*) AS cnt 
	FROM mails 
	GROUP BY email
	HAVING `status` IN ('status1', 'status2')
) AS subq WHERE cnt = 1;
Ответ написан
ertaquo
@ertaquo
Как-то так вроде:
SELECT * FROM table WHERE email NOT IN (SELECT email FROM table WHERE email NOT LIKE "status2")
Ответ написан
mark_ablov
@mark_ablov
select email from t where email not in (select email from t where status = 'status2') and status = 'status1'
Но это коряво, думайте над архитектурой БД или логикой.
Ответ написан
FreeTibet
@FreeTibet
dharma supplier

SELECT m1.* FROM mails AS m1 
WHERE NOT EXISTS(
	SELECT * FROM mails AS m2 
	WHERE 
		m2.email = m1.email AND m2.`status` = 'status2'
)


Но первый вариант красивее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы