MYSQL INNER JOIN с пустыми столбцами - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь использовать 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

EDITED

Я изменил заголовок с "MYSQL INNER JOIN with OR Clause" на текущий, чтобы было легче найти людей, имеющих такую ​​же проблему. Оказывается, эта проблема на самом деле связана с тем, что столбцы JOINED имеют пустые или нулевые значения. Принятый ответ объясняет причину проблемы и предоставляет решение.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Я нашел решение. Согласно этой статье , INNER JOIN не будет работать с полями, которые имеют NULL или пустые значения. Ответ выше не работал, так как CLAUSE, который предназначался для фильтрации столбцов NULL, выполнялся после того, как INNER JOIN был оценен с NULL или пустыми столбцами. Поэтому, учитывая эту информацию, я отфильтровал столбцы NULL в фактическом операторе INNER JOIN, а не после.

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 

И это сработало! спасибо за помощь, ребята.

0 голосов
/ 08 сентября 2018

убедитесь, что у вас тоже нет нулевых значений

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
...