У меня есть 3 таблицы InnoDB: электронные письма, сайты и подписки.MYSQL запрос (с соединениями и виртуальные ценности)
электронная почта стол имеет id
и email
столбцы.
сайты стол имеет id
и address
колонок.
подписки таблица имеет id
, email_id
и website_id
столбцов.
Что мне нужно сделать, это отправить электронное письмо и вернуть стол с колонками address
и subscribed
. Первый - это список всех адресов в таблице , а последний получает значение 1, если указанный адрес электронной почты имеет место в таблице подписок с website_id
, установленными на этом веб-сайте, или 0 в противном случае. Но я хочу сохранить все веб-сайты, даже если пользователь не найден.
Точка, в которой я застряла, - это то, где я должен изменить значение виртуального столбца subscribed
от 0 до 1, когда это письмо имеет эту запись.
Вот мой вопрос до сих пор. Кто-нибудь знает, как это сделать?
SELECT `address`, "0" AS `subscribed`
/* 0 becomes 1 for the websites email has subscribed to */
FROM `websites` a
LEFT JOIN (
SELECT s.`website_id` FROM `subscriptions` s
RIGHT JOIN (
SELECT `id` AS `email_id` FROM `emails`
WHERE `email`='[email protected]' LIMIT 1) e
ON s.`email_id`=e.`email_id`) l
ON l.`website_id`=a.`id`
А вот пример выходов для требуемых значений для subscribed
колонки:
- Если электронная почта не найден в
emails
таблице все строки получить значение 0 - Если электронная почта найдено в
emails
таблице ...- , если он не найден в таблице
subscriptions
все строки получить значение 0 - , если он находится в
subscriptions
таблице, соответствующие адресные строки получить значение 1
- , если он не найден в таблице
Позвольте мне знать, если я не мог wxplain это хорошо. Кто-нибудь знает, что я должен изменить в моем запросе?
Заранее спасибо.
Вы должны избегать использования ПРАВИЛЬНЫХ СОЕДИНЕНИЙ. Они не считаются хорошим стилем, и, по моему опыту, MySQL запускает их LOT медленнее, чем эквивалентное левое соединение. – Poodlehat
Спасибо. Я, как правило, тоже не использовал их, но я потерялся в этом запросе, поэтому подумал, может быть ... но благодаря Джо проблема решена. Я избавился от правильного соединения :) – inhan