MYSQL查询(带有连接和虚拟值)

MYSQL查询(带有连接和虚拟值),mysql,join,Mysql,Join,我有3个InnoDB表:电子邮件,网站和订阅 电子邮件表中有id和email列 网站表中有id和address列 订阅表中有id、email\u id和website\u id列 我要做的是提供一封电子邮件,并返回一个表,其中包含地址和订阅。前者是网站表中所有地址的列表,如果提供的电子邮件地址出现在订阅表中且网站id设置为该网站,则后者的值为1,否则为0。但我愿意保留所有的网站,即使找不到用户 我陷入困境的一点是,当该电子邮件具有该记录时,我应该将虚拟列subscribed的值从0更改为1 这是

我有3个InnoDB表:电子邮件网站订阅

电子邮件表中有
id
email

网站表中有
id
address

订阅表中有
id
email\u id
website\u id

我要做的是提供一封电子邮件,并返回一个表,其中包含
地址
订阅
。前者是网站表中所有地址的列表,如果提供的电子邮件地址出现在订阅表中且
网站id设置为该网站,则后者的值为1,否则为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
  • 如果在
    电子邮件
    表中找到电子邮件。。。
    • 如果在
      subscriptions
      表中找不到它,则所有行的值都为0
    • 如果在
      subscriptions
      表中找到它,则相应的地址行的值为1
如果我不能解释清楚,请告诉我。有人知道我应该在我的问题中修改什么吗

提前谢谢

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

应该避免使用右连接。它们被认为不是好的样式,根据我的经验,MySQL运行它们的速度比同等的左连接慢得多。谢谢。我通常也不会使用它们,但我在这个查询中迷失了方向,所以我想也许。。。但多亏了乔,问题才得以解决。我摆脱了正确的加入:)非常感谢。你的第一个代码很好,但我更喜欢第二个。后者的问题是它返回浮点数,所以我在第一行添加了一点内容:
选择w.address,CAST(COALESCE(s.id/s.id,0)作为已签名)作为已订阅的