0

我有以下架构

CREATE TABLE `filmati` (
  `idfilmato` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`idfilmato`)
) ;

CREATE TABLE `utenti` (
  `idutente` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`idutente`)
) ;

CREATE TABLE `utenti_has_filmati` (
  `fkutente` int(11) NOT NULL,
  `fkfilmato` int(11) NOT NULL,
  PRIMARY KEY (`fkutente`,`fkfilmato`),
  KEY `fk_Utenti_has_videos_videos1_idx` (`fkfilmato`),
  KEY `fk_Utenti_has_videos_Utenti_idx` (`fkutente`),
  CONSTRAINT `fk_Utenti_has_videos_Utenti` FOREIGN KEY (`fkutente`) REFERENCES `utenti` (`idutente`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_Utenti_has_videos_videos1` FOREIGN KEY (`fkfilmato`) REFERENCES `filmati` (`idfilmato`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ;

和数据:

Insert into filmati VALUES (1);
Insert into filmati VALUES (2);
Insert into filmati VALUES (3);

insert into utenti values(1);
insert into utenti values(2);
insert into utenti values(3);

insert into utenti_has_filmati values(1,2);
insert into utenti_has_filmati values(1,3);
insert into utenti_has_filmati values(2,3);
insert into utenti_has_filmati values(2,1);
insert into utenti_has_filmati values(3,1);
insert into utenti_has_filmati values(3,2);

我想要一个可以告诉我缺失关系的查询

在这种情况下:

1 1
2 2
3 3

有什么建议吗?

4

3 回答 3

3

(交叉)连接这两个表,所以你得到所有 filmati 和所有 utenti 的组合(=cathesian 产品)。

然后您可以left join将联结表utenti_has_filmati加入所有现有关系。

然后使用 where 子句只返回联结表中没有匹配行的那些记录

select u.idutente, f.idfilmato 
from 
  utenti u
  cross join filmati f
  left join utenti_has_filmati uf 
     on uf.fkutente = u.idutente and 
        uf.fkfilmato = f.idfilmato
where
  uf.fkfilmato is null -- Check for either field. Doesn't matter.
于 2013-07-17T11:17:19.283 回答
2
SELECT 
    A.idfilmato, B.idutente 
  FROM
    filmati A,utenti B
  WHERE NOT EXISTS
  (
    SELECT 1
    FROM
      utenti_has_filmati AB
    WHERE
      AB.fkutente = A.idfilmato AND
      AB.fkfilmato = B.idutente
  )
于 2013-07-17T11:24:44.597 回答
1

可能最快的方法如下:

select idfilmato, idutente 
from filmati 
join utenti 
left outer join utenti_has_filmati on (idfilmato = fkfilmato and idutente = fkutente)
where fkutente is null;
于 2013-07-17T11:15:54.723 回答