2017-06-19 120 views
0

我有2代表“conta”和“details”和两个表在不同的情况下,空值和数据MySQL的左外连接排除

conta 
id col1 col2 col3 col4 
1 Hi Bye See YOU 
2 Hello (NULL) (NULL) (NULL) 

details 

id new_column1 new_column2 new_column3 
1 bye see you 

我想联接基于col2=new_column1 and col3 = new_column2 and col4 = new_column3申请并获得价值存在于conta,而不是在details,所以我的输出将是

conta 
id col1 col2 col3 col4 
2 hello (NULL) (NULL) (NULL) 

但不知何故,我不能这样做。我写下面的查询,但它根本不会导致我想要的值。

SELECT `id`,`col1`,`col2`,`col3`,`col4` FROM `conta` 
WHERE LOWER(`col2`) + LOWER(`col3`) + LOWER(`col4`) NOT IN (SELECT DISTINCT(LOWER(`new_column1`) + LOWER(`new_column2`) + LOWER(`new_column3`)) 
FROM `details`); 

它只是给我没有结果!在显示屏上

任何帮助?

编辑:我试着在@Uueerdo建议的下面查询,它并没有给我我想要的。

SELECT conta.id,`col1`,`col2`,`col3`,`col4` FROM `conta` 
LEFT OUTER JOIN `details` 
ON ((conta.col2 IS NULL AND details.new_column1 IS NULL) 
    OR (LOWER(conta.col2) = LOWER(details.new_column1))) 
AND ((conta.col3 IS NULL AND details.new_column2 IS NULL) 
    OR (LOWER(conta.col3) = LOWER(details.new_column2))) 
AND ((conta.col4 IS NULL AND details.new_column3 IS NULL) 
    OR (LOWER(conta.col4) = LOWER(details.new_column3))) 
WHERE details.id IS NULL 

在输出中col2我看到的值“操作”,其也存在于new_column1details表。这意味着,因为我想申请左外连接排除我甚至使用LEFT JOIN代替LEFT OUTER JOIN试过它不应该存在于输出和它不工作要么

EDIT2:我找到了解决方案。查询工作并完成这项工作。 Exept,我不得不运行一个命令来替换我应用连接到NULL值的列中的所有空白单元格。

+0

我认为您需要清理一下您的示例数据;它看起来像第一行的5个字段中有6个值。 – Uueerdo

+0

我的不好!我刚刚纠正了这一点。我其实很好奇,知道为什么它不给我想要的结果。我的意思是我的查询出了什么问题。 – Enthusiast

+0

请参阅编辑我的答案。 – Uueerdo

回答

1

你最好用SELECT .... FROM a LEFT JOIN b ON conditions WHERE b.id IS NULL风格的查询;空比较有点不同(并且可以处理连接条件)。

例如,这些计算为NULL,这是不是真的,哪个是假的:

  • NULL = NULL
  • 空值(NULL)

但你可以做这样的事情能够更容易地比较空值:

  • ISNULL(A,X)= ISNULL(b,X)
  • (a为null,B是NULL)

所以你连接条件可以是这样的:

[...] 
ON ((conta.col2 IS NULL AND details.new_column1 IS NULL) 
    OR (LOWER(conta.col2) = LOWER(details.new_column1))) 
AND ((conta.col3 IS NULL AND details.new_column2 IS NULL) 
    OR (LOWER(conta.col3) = LOWER(details.new_column2))) 
[and so on...] 
WHERE details.id IS NULL 

这是假定details具有某种非空行标识字段,可以使用可靠地确定是否匹配。


编辑:您当前的查询(除了我前面提到的空问题)准确的问题是,+是不能在MySQL中串联,这是加法。使用数据显示LOWER(col2) + LOWER(col3) + LOWER(col4)LOWER(new_column1) + LOWER(new_column2) + LOWER(new_column3)以及产量0的行中没有NULL值。您需要使用CONCAT()函数来执行操作;但我会劝阻它,因为CONCAT('abc', 'def', '')等于CONCAT('ab', 'cd', 'ef')

旁注:DISTINCT不是一个功能,()将没有效果(比,如果他们包含不止一个结果场可能会导致一个问题等)。


你可以把你的一般格式,和上述空问题,用此格式的简单变化:WHERE (a, b, c) IN (SELECT a, b, c FROM ....

+0

我经历了你的建议,它不起作用。我已将我的语法和关注添加到我的文章中 – Enthusiast

+0

没关系,我找到了问题。有一些单元格除NULL值外还有空格。您的解决方案有效。 – Enthusiast

-1

您可以使用EXISTS运算符来创建一个反半连接。请看看这个链接:https://www.techonthenet.com/mysql/exists.php

实例查询:

SELECT 
    id, 
    col1, 
    col2, 
    col3, 
    col4 
FROM conta 
WHERE NOT EXISTS (
    SELECT 1 
    FROM details 
    WHERE conta.col2 LIKE details.new_column1 
     AND conta.col3 LIKE details.new_column2 
     AND conta.col4 LIKE details.new_column3 
) 
-1

你的问题的解决办法是内加入您的(通讯录)与(详细信息表) 并获得所有列其中(接触。*) Contact.col1!= details.new_column1

这里是一个查询

Select conta.* from conta inner join details on conta.col1!=details.new_column1 

你可以和更多凡内柱加入

+0

如果您有任何问题评论请 –

+0

您的查询正在获取所有'conta',其中有些内容与'details'中的内容不匹配;与'details'中没有匹配的'conta'相反。另外,你的第一句话没有多大意义。我会把它记在翻译问题上,但不知道为什么“contact。*”应该被提及。 – Uueerdo

0

您可以执行左连接,然后在第二个表中测试空值以查找第一个表中与第二个表中的任何行不匹配的行。

SELECT 
    a.`id`, 
    a.`col1`, 
    a.`col2`, 
    a.`col3`, 
    a.`col4` 
FROM `conta` a 
LEFT JOIN `details` b 
ON a.`col2` like b.`new_column1` 
    AND a.`col3` like b.`new_column2` 
    AND a.`col4` like b.`new_column3` 
WHERE b.`id` IS NULL