【问题标题】:MYSQL INNER JOIN with Empty columns带有空列的 MYSQL INNER JOIN
【发布时间】:2018-09-08 06:48:34
【问题描述】:

我正在尝试使用两个可选子句来使用 MYSQL 的 INNER JOIN。但它似乎并没有返回所有数据。有关如何改进此查询的任何提示?

SELECT * 
FROM ImportedContacts t1 
INNER JOIN users t2 
    ON (t1.Emails = t2.email OR 
        t1.Phones = t2.Phone) 
WHERE t1.Username = 'user' AND 
  NOT t2.email = '' 
ORDER BY t2.first_name 
  LIMIT 60

已编辑

我将标题从“MYSQL INNER JOIN with OR Clause”更改为当前标题,以便有相同问题的人更容易找到。事实证明,这个问题实际上与正在加入的列具有空值或空值有关。接受的答案解释了问题的原因并提供了解决方案。

【问题讨论】:

  • But it doesn't seem to be returning all the data 没有实际数据我们无法猜测。您是指电子邮件/电话号码中的一些 NULL 值吗?
  • 不,我的意思是它遗漏了一些行。
  • 哪几行?您知道我们看不到您的实际数据吗?您可以只发布应该返回但您的查询忽略它们的示例数据吗?
  • I don't have the permission to share the actual data 我们对实际数据从不感兴趣,只是任何sample data 都是实际的“代表”,以便我们准确了解您的问题。
  • @user2993497 请花一些精力来准备重现您的案例的示例数据。一个案例就足够了。文字不会用预期的行为替换样本数据

标签: mysql join null inner-join


【解决方案1】:

确保你也没有空值

SELECT * 
FROM ImportedContacts t1 
INNER JOIN users t2 ON (t1.Emails = t2.email OR t1.Phones = t2.Phone) 
WHERE t1.Username = 'user' 
AND  ( NOT t2.email = '' OR   t2.email IS NOT NULL ) 
ORDER BY t2.first_name LIMIT 60

【讨论】:

  • 非常感谢您的意见。我知道这不是因为即使没有 NOT t2.email = '' 它也无法按预期工作。
【解决方案2】:

我找到了解决方案。根据这个articleINNER JOIN 不适用于具有NULL 或空值的字段。上面的答案不起作用,因为旨在过滤掉 NULL 列的 CLAUSE 在使用 NULL 或空列评估 INNER JOIN 之后运行。因此,考虑到这些信息,我过滤掉了实际 INNER JOIN 语句中的 NULL 列,而不是之后。

SELECT * 
FROM   importedcontacts 
       INNER JOIN users 
               ON ( users.email = importedcontacts.emails 
                     OR ( ( importedcontacts.phones = users.phone ) 
                          AND NOT importedcontacts.phones = '' 
                          AND NOT users.phone = '' ) ) 
WHERE  importedcontacts.username = 'user' 
ORDER  BY users.first_name 

它奏效了!谢谢你们的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2015-10-09
    • 2016-06-19
    • 2017-02-18
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多