我想做一个简单的选择 - 但这个条件对我来说有点棘手(因为我是一个SQL初学者)。
我得到了这张桌子:
userid | email | newsletters
1 | test@example.com | 1,2
2 | test2@example.com | 1
现在我想获取所有希望获得简报“2”的用户的电子邮件地址。
这将是:
email | newsletters
test@example.com | 1,2
当然:在另一个查询中,所有用户都订阅了第1号通讯:
结果:
email | newsletters
test@example.com | 1,2
test2@example.com | 1
什么是正确的SQL查询? 我认为这应该是正确的开始,但我不知道我必须使用哪种条件:
SELECT email FROM users WHERE newsletter CONDITION?
你可以帮帮我吗? : - )
答案 0 :(得分:2)
假设新闻稿的数量不能高于9
,这将完成工作:
SELECT email FROM users WHERE newsletters LIKE '%2%'
如果您想要更多这些,那么表格规范化会非常有用。
修改强> @sgeddes在评论中提出了很好的建议,使其适用于任何数量的新闻通讯:
SELECT email FROM users WHERE concat(',',newsletters,',') LIKE '%,2,%'
答案 1 :(得分:0)
如果您真的想要这样做,请使用regular expression,但我认为您需要重新设计表格结构。您应该在User和Newspaper之间创建一个桥接表,而不是在User表中存储每个用户的简报:
User table
userid | email
1 | test@example.com
2 | test2@example.com
Newspaper table
paperid | name
1 | the Sun
2 | the Mirror
UserNewspaper Bridge table
userid | paperid (represents, not part of table)
1 | 1 (test@example.com receives the Sun)
1 | 2 (test@example.com receives the Mirror)
2 | 1 (test2@example.com receives the Sun)
要获取想要paperid 2的用户的所有电子邮件地址,您可以写下:
select a.email
from User a,
UserNewspaper b
where a.userid = b.userid
and b.paperid = 2
要获取想要镜像的用户的所有电子邮件地址,请写下:
select a.email
from User a,
UserNewspaper b,
Newspaper c
where a.userid = b.userid
and b.paperid = c.paperid
and c.name = 'the Mirror'