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

(クロス) 2 つのテーブルを結合すると、すべての filmati とすべての utenti (=カテジアン プロダクト) の組み合わせが得られます。

次に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 に答える