Полное внешнее соединение в 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
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;
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)