Mysql选择不在查询中

时间:2015-06-27 08:02:42

标签: php sql

SELECT t.* from test t where t.name ='test123' and t.subject NOT IN (SELECT * from result_master where email = 'fusion1234@gmail.com')

上述查询给出以下错误:

  

1241 - 操作数应包含1列错误显示

知道它有什么问题吗?

3 个答案:

答案 0 :(得分:3)

错误说明了一切。

使用IN时,您应该只选择子查询中的必需列(不要使用*):

SELECT t.* 
from test t 
where t.name ='test123' 
  and t.subject NOT IN (SELECT subject 
                        from result_master 
                        where email = 'fusion1234@gmail.com')

答案 1 :(得分:0)

内部查询应该是

               (SELECT subject 
                from result_master 
                where email = 'YourEmail@domain.com')

为什么?

因为,在您的问题中,您要将电子邮件列值与多个列值进行比较。

在您返回的子查询中表示10个字段,但您只能使用一列。它实际上是内部以逗号分隔的列表,但是您为外部查询提供了错误的结果。

答案 2 :(得分:0)

虽然简单的解决方案是使用NOT IN,但十NOT EXISTS更适合此类查询。您可以将*NOT EXISTS一起使用,但我更喜欢使用1

SELECT t.*
from test t
where t.name ='test123' and
      NOT EXISTS (SELECT 1
                  from result_master rm
                  where rm.email = 'fusion1234@gmail.com' and 
                        t.subject = rm.subject
                 );

为什么这样更好?两个版本之间存在语义差异。如果子查询中result_master.subject的任何值为NULL,则NOT IN将永远不会返回任何行。在这种情况下,NOT EXISTS执行通常需要的操作 - 它会忽略NULL值。

注意:即使列(说subject)声明为NOT NULL,我仍然偏向NOT EXISTS。它通常还具有比NOT IN更好的性能特征。