2015-10-07 90 views
0

嗨,我有以下表格和列。在电影数据库mysql中完全外连接

movie: ID, title 

person: ID, name 

involved: personID, movieID 

我需要回答这样的问题:

“哪个电影要么约翰·特拉沃尔塔和乌玛·瑟曼,但不能同时出演?”

我不知道如何做到这一点,而不创建新的表,所以我做了2个新表。并试图做完整的外连接,在那里你没有得到相交的结果。我发现你不能在mysql中进行完整的外连接,但必须进行左连接,并与右连接进行结合。我尝试过,但没有得到我想要的结果。我一直在卡住一段时间。任何人都可以将我指向正确的方向吗?

这是我到目前为止。

DROP TABLE IF EXISTS Umatable; 
DROP TABLE IF EXISTS Johntable; 

CREATE TABLE Umatable(title VARCHAR(500)); 
CREATE TABLE Johntable(title VARCHAR(500)); 

INSERT INTO Umatable 
SELECT m.title 
FROM movie m, person p, involved i 
WHERE p.name = "Uma Thurman" 
AND p.id = i.personid 
AND m.id = i.movieiD; 

INSERT INTO Johntable 
SELECT m.title 
FROM movie m, person p, involved i 
WHERE p.name = "John Travolta" 
AND p.id = i.personid 
AND m.id = i.movieiD; 

SELECT * 
FROM Umatable 
LEFT JOIN Johntable ON Umatable.title = Johntable.title 
WHERE Johntable.title IS NULL OR Umatable.title IS NULL 
UNION 
SELECT * 
FROM Umatable 
RIGHT JOIN Johntable ON Umatable.title = Johntable.title 
WHERE Johntable.title IS NULL OR Umatable.title IS NULL 

回答

0

相关子查询内部的count(*)将工作:

select * 
    from movie m 
where 1 = (select count(*) 
       from involved i 
       join person p 
       on p.ID = i.personID 
       and p.name IN ('John Travolta', 'Uma Thurman') 
      where i.movieID = m.ID) 

SQLFiddle Demo

2

我会做到这一点使用聚合和having

select i.movieId 
from involved i join 
    person p 
    on p.id = i.personId 
group by i.movieId 
having sum(p.name in ('John Travolta', 'Uma Thurman')) = 1;