让我们说我有两张表A和B
A是具有列ID,名称,已创建,已修改
的表国家/地区包含一堆国家/地区
B是具有列id,first_name,last_name,email,country_id,创建,修改的表用户
包含通过外键 country_id
链接到国家/地区的一组用户最有效的查询是让所有没有用户使用电子邮件地址的国家" myemail@test.com"与之相关吗?
我尝试了类似下面的内容但是没有效果:
SELECT DISTINCT
c.*
FROM
countries c
LEFT JOIN
users u ON u.country_id = c.id
WHERE
u.email <> 'myemail@test.com'
感谢您的帮助
注意我还尝试将条件放在ON子句中的电子邮件列中,该条款不起作用
答案 0 :(得分:3)
SELECT c.*
FROM countries c LEFT JOIN
users u
ON u.country_id = c.id AND u.email = 'myemail@test.com'
WHERE u.country_id IS NULL;
很好,您只需要正确设置:
NOT EXISTS
就性能而言,这应该与NOT IN
和NULL
非常相似(虽然我不建议使用后者,因为当CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`profilepicture` blob,
)
值存在时,它会有不同的行为。)< / p>
答案 1 :(得分:0)
如果您说'#34;用户没有电子邮件地址&#34; myemail@test.com"&#34;, 你的意思是没有电子邮件地址 - 或者 - 不是那个确切的电子邮件地址吗?
<强>更新强>
然后这应该做:
SELECT DISTINCT c.*
FROM countries c
LEFT JOIN users u ON u.country_id = c.id and u.email = 'myemail@test.com'
WHERE u.country_id is null
我认为这是戈登已经拥有的。
再次更新
在这种情况下,请尝试:
SELECT DISTINCT c.*
FROM countries c
INNER JOIN users u ON u.country_id = c.id and ISNULL(u.email, '') = ''
这会查找Null或Empty String电子邮件地址,所有其他地址都从连接中排除,因此也从结果集中排除。
我希望这会有所帮助。