【问题标题】:join sql query based on value of another table (in one query)根据另一个表的值加入 sql 查询(在一个查询中)
【发布时间】:2018-07-02 20:45:02
【问题描述】:

假设我有两个表 A 和 B

A 是表国家,具有列 id、name、created、modified

包含多个国家/地区

B 是表用户,列 id、first_name、last_name、email、country_id、created、modified

包含一组通过外键 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 子句中的电子邮件列上,但也不起作用

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    left join 没问题,你只需正确设置即可:

    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 EXISTSNOT IN 非常相似(尽管我不推荐后者,因为当有NULL 值时它的行为不同)。

    【讨论】:

      【解决方案2】:

      当您说“没有电子邮件地址为“myemail@test.com”的用户”时, 你的意思是没有电子邮件地址 - 或者 - 不是那个确切的电子邮件地址?

      更新

      那么应该这样做:

      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
      

      我相信这是 Gordon 已经拥有的。

      再次更新

      在这种情况下,请尝试:

      SELECT DISTINCT c.*
      FROM countries c
      INNER JOIN users u ON u.country_id = c.id and ISNULL(u.email, '') = ''
      

      这会查找 Null 或 Empty String 电子邮件地址,所有其他电子邮件地址都从联接中排除,因此从结果集中排除。

      我希望这会有所帮助。

      【讨论】:

      • 是的,和@Gordon 一样
      • 我的错,你说:不是那个确切的地址 - 新的解决方案即将推出。
      • @user765368 ,上面两个查询之一应该是一个。但我仍然不确定你的问题。听起来您是在说(戈登也是这样解释的)每个国家/地区的每个人都应该拥有相同的电子邮件地址 - 向我显示至少有一个用户没有相同地址的国家/地区列表和世界其他地方一样。对吗?
      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 2017-09-10
      • 2020-04-07
      • 2017-11-14
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多