2013-08-09 23 views
9

Ich bin sehr neu in SQL und ich wollte etwas Hilfe beim Schreiben dieser SQL-Abfrage.MySQL - wie schreibe ich diese Abfrage

Ich habe einen Film Tabelle wie folgt aus:

Movie_id Actor_name Director_name 
1   a    AA 
1   b    AA 
2   b    BB 
2   d    BB 

Jetzt möchte ich alle Paare von Akteuren auszudrucken und Direktoren, die nicht miteinander gearbeitet - für zB in diesem Fall wird es ausdrucken (a, BB) und (d, AA)

Antwort

2

Sie können es wie folgt tun:

SELECT a.Actor_name, d.Director_name 
FROM (
    (SELECT DISTINCT Actor_name from movie) a 
    CROSS JOIN 
    (SELECT DISTINCT Director_name from movie) d 
) WHERE NOT EXISTS (
    SELECT * FROM movie m 
    WHERE m.Actor_name=a.Actor_name 
    AND m.Director_name=d.Director_name 
) 

die Idee, alle möglichen Paare von Akteuren zu produzieren ist und Direktoren (kartesischen Produkt in der Mitte der Verbindung Frage), t henne seine Ergebnisse filtern, um Paare auszuschließen, die durch einen Film verbunden sind (der NOT EXISTS Zustand).

Hier ist ein demo on sqlfiddle.

1

ich dies tun würde, indem man zuerst mit einem Kreuz alle Paare von Schauspielern und Regisseuren Entwicklung verbinden (das heißt Cartesian product), und dann diese Liste filtern Sie die Tabelle der beobachteten Beziehungen verwenden.

SELECT * 
FROM (
    -- cross join 
    SELECT a.actor_name, d.director_name 
    FROM (SELECT DISTINCT actor_name FROM movies) a 
    ,(SELECT DISTINCT director_name FROM movies) d 
    ) pairs 
WHERE NOT EXISTS (
    SELECT 1 FROM movies m 
    WHERE pairs.actor_name = m.actor_name 
    AND pairs.director_name = m.director_name 
    ) 

SQLFiddle Demo (Schema grundsätzlich von dasblinkenlight Geige gespülten da er mich, um es zu schlagen).

1

Eine Alternative:

select distinct t1.actor_name, t2.director_name from t t1, t t2 
where (t1.actor_name, t2.director_name) not in (
    select actor_name, director_name from t) 

Fiddle here.

Eine weitere Alternative:

select distinct t1.actor_name, t2.director_name from t t1 
cross join t t2 left join t t3 
on t1.actor_name = t3.actor_name and t2.director_name = t3.director_name 
where t3.actor_name is null 

Fiddle here.

+1

Ihre erstes ist die einfachste. Ich mag das :) – Franco

0

Auch in kartesischem Produkt (mit früheren Antworten mit einigen Unterschieden) basiert:

select distinct m.Actor_name, mo.Director_name 
from movie m 
cross join movie mo 
where (not exists (select mv.Actor_name, mv.Director_name 
        from movie mv 
        where (mv.Actor_name = m.Actor_name and mv.Director_name = mo.Director_name))) 

Fiddle

Verwandte Themen