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