基于另一个表的值加入sql查询(在一个查询中)

时间:2018-01-23 22:16:26

标签: mysql sql

让我们说我有两张表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子句中的电子邮件列中,该条款不起作用

2 个答案:

答案 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 INNULL非常相似(虽然我不建议使用后者,因为当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电子邮件地址,所有其他地址都从连接中排除,因此也从结果集中排除。

我希望这会有所帮助。