从table1中选择特定数据,该数据不在table2中,而是where子句

时间:2014-08-09 12:47:16

标签: mysql sql database fetch

我想从table1中选择不在table2中的数据,但是我必须从table1中选择一个特定的数据

我的数据表

CREATE TABLE IF NOT EXISTS `table3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `acc_id` int(11) NOT NULL DEFAULT '0',
  `did` int(11) NOT NULL,

  PRIMARY KEY (`id`)
) 



CREATE TABLE IF NOT EXISTS `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `acc_id` int(11) NOT NULL,
  `table1_id` int(11) NOT NULL,
  `did` int(11) NOT NULL,

  PRIMARY KEY (`id`)
) 


CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `acc_id` int(11) NOT NULL DEFAULT '0',

  `name` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`id`)

)

我想做

从table1中选择name,id,其中id!=(从table2中选择table1_id,在table2.acc_id = table3.acc_id,其中table2.did = 4759505,table2.acc_id = 2,表table1acid = 2),并且table1.acc_id = 2

如果子查询返回1行,则上面的查询很好,但如果子查询返回多行则不行

由于

1 个答案:

答案 0 :(得分:0)

您只需将!=更改为not in

即可
select name, id
from table1
where id not in (select table1_id
                 from table2 join
                      table3
                      on table2.acc_id = table3.acc_id
                      where table2.did = 4759505 and table2.acc_id = 2
                ) and
      table1.acc_id = 2;

注意:您还应确保子查询中的table1_id永远不会NULL。在这种情况下,NOT IN可能不直观。通常,我更喜欢NOT EXISTS

select name, id
from table1
where not exists (select table1_id
                  from table2 join
                       table3
                       on table2.acc_id = table3.acc_id
                       where table2.did = 4759505 and table2.acc_id = 2 and
                             table1_id = table1.id
                 ) and
      table1.acc_id = 2;

这更直观地处理NULL值。