0

嗨,我有以下表格和列。

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
4

2 回答 2

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;
于 2015-10-07T02:22:17.640 回答
0

相关子查询内部的Acount(*)将起作用:

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 演示

于 2015-10-07T02:18:15.533 回答