2017-07-25 101 views
0

我想比较table1table2与指定的列作为字符串,并希望返回不匹配的记录table1MySQL不喜欢查询

它使用其他方式只是'like',并返回匹配结果时,它很好用。

但我真的希望得到无与伦比的记录。

下面是示例表

 
    table 1 
    ---------------------------------- 
    No.  DesignID 
    1  c12345 
    2  c16 
    3  c20

Table 2 
    ---------------------- 
    No. DesignOption 
    1  Online-c12345-print 
    2  Online-c16-proof 

$db->fetchallColumn(SELECT distinct(a.DesignID) FROM table1 as a, table2 as b where b.DesignOption 
    not like CONCAT('%', a.DesignID, '%')); 

与加入例如

$db->fetchallColumn(SELECT distinct(a.DesignID) FROM table1 as a inner join 
table2 as b on b.DesignOption not like CONCAT('%', a.DesignID, '%')); 

预期结果:C20

相反,我得到所有记录从表1

任何帮助,可以赞赏。

+0

你需要'join'表1至表2试试吧。现在你正在从table1中选择所有东西(目前它不受where子句或table2限制) – RToyo

+0

@RobbieToyota感谢您的快速响应,我尝试了一些连接查询,但得到的结果相同。我会在我的问题中加上这个。 – Bagan

+0

看着你的更新,它看起来不像你已经完成了联合声明。表a中哪列与b.DesignOption对应?你应该有这样的东西:'SELECT [FROM] FROM table1 as JOIN table2 as b ON b.DesignOption = a.CorrespondingColumn'。 – RToyo

回答

3

假设你的查询工作,只需使用一个外部联接:

SELECT DISTINCT a.DesignID 
FROM table1 a left join 
    table2 b 
    ON b.DesignOption like CONCAT('%', a.DesignID, '%') 
WHERE b.DesignOption IS NULL; 

注意DISTINCT不是一个函数。 SQL运算符是SELECT DISTINCT。不要使用括号 - 除非你有这样做的理由。

+0

您的查询在CONCAT附近有语法错误('%',a.DesignID,'%' –

+0

谢谢,我会试试这个.. – Bagan

+0

一个完美的答案,谢谢Gordon先生 – Bagan

0

但是,如果你想看到子查询的方法。

Select DesignID From Table1 
Where DesignID not in (SELECT a.DesignID 
FROM table1 as a inner join 
table2 as b on b.DesignOption like CONCAT('%', a.DesignID, '%')) 
+1

子查询的作品很容易理解,但它在数据集中的效率可能会大大低于每个表中的数千个记录。 – Shawn

+0

感谢您的意见。 –

1

您可以这样

SELECT DISTINCT b.DesignID 
FROM table2 a RIGHT JOIN 
table1 b 
ON a.DesignOption NOT LIKE CONCAT('%', b.DesignID, '%') 
WHERE a.DesignOption IS NOT NULL; 

希望它会工作

+0

谢谢VJY,您的回答也不错 – Bagan

+0

我个人认为'RIGHT JOIN's是由阿司匹林公司可以提高收入。:-)在大多数情况下,可以将“RIGHT JOIN”重写为“LEFT JOIN”,以使数据更有意义并产生稍好的查询计划。此外,查询优化器上的NOT LIKE将会非常繁重。 – Shawn