MYSQL-запрос (с объединениями и виртуальными значениями) - PullRequest
0 голосов
/ 18 января 2012

У меня есть 3 таблицы InnoDB: электронные письма , веб-сайты и подписки .

электронные письма таблица содержит id и email столбцы.

веб-сайты таблица содержит id и address столбцы.

подписка таблица содержит id,email_id и website_id столбцы.

То, что я пытаюсь сделать, это предоставить электронную почту и вернуть таблицу с столбцами address и subscribed.Первый представляет собой список всех адресов в таблице веб-сайтов , а второй получает значение 1, если указанный адрес электронной почты встречается в таблице subscription с 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`='someone@mail.com' 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

Дайте мне знать, если я не смог объяснить это хорошо,Кто-нибудь знает, что я должен изменить в своем запросе?

Заранее спасибо.

1 Ответ

2 голосов
/ 18 января 2012
SELECT w.address, CASE WHEN s.id IS NULL THEN 0 ELSE 1 END AS subscribed
    FROM websites w
        LEFT JOIN subscriptions s
            INNER JOIN emails e
                ON s.email_id = e.id
                    AND e.email = 'someone@mail.com'
            ON w.id = s.website_id

Вы также можете придумать значение подписки таким образом, что немного более кратко, но и несколько менее очевидно.

SELECT w.address, COALESCE(s.id/s.id, 0) AS subscribed
    FROM websites w
        LEFT JOIN subscriptions s
            INNER JOIN emails e
                ON s.email_id = e.id
                    AND e.email = 'someone@mail.com'
            ON w.id = s.website_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...