MySQL - 如何编写此查询

时间:2013-08-09 00:20:19

标签: mysql sql

我是SQL的新手,我在编写这个SQL查询时需要一些帮助。

我有一个这样的电影表:

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

现在我想打印出所有没有互相合作的演员和导演 - 例如在这种情况下它会打印出来(a,BB)和(d,AA)

4 个答案:

答案 0 :(得分:2)

你可以这样做:

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
)

这个想法是生成所有可能的演员和导演对(在查询中间的笛卡尔积连接),然后过滤其结果以排除通过电影连接的对(NOT EXISTS条件)。 / p>

这是demo on sqlfiddle.

答案 1 :(得分:1)

我会首先通过交叉连接(即Cartesian product)开发所有演员和导演对,然后使用观察到的关系表过滤掉这个列表。

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(架构基本上是从dasblinkenlight的小提琴中解脱出来的,因为他打败了我。)

答案 2 :(得分:1)

另一种选择:

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)

小提琴here

另一种选择:

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

小提琴here

答案 3 :(得分:0)

同样基于笛卡尔积(与先前的回复有一些差异):

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