****EDIT**** ここに SQL Fiddleリンクを追加する 私は SQL Fiddle でシナリオを作成し、私が達成しようとしていることを示しました。SQL Fiddle で正確な結果が得られるにもかかわらず、DB を使用して以下の結果が得られるのは非常に奇妙です。
ただし、季節が本当に存在することを証明するために、テレビシリーズに参加するテレビシーズンの一部を以下に示します。
このクエリの実行:
SELECT TVSeriesHasTVSeason.tvSeriesID, TVSeason.tvSeasonID, TVSeason.title, Users.userID,
CASE
WHEN UserHasWatchedTVSeason.tvSeasonID IS NULL THEN 'No'
ELSE 'Yes'
END as watched
FROM TVSeason
CROSS JOIN Users
LEFT JOIN UserHasWatchedTVSeason
ON TVSeason.tvSeasonID = UserHasWatchedTVSeason.tvSeasonID
AND Users.userID = UserHasWatchedTVSeason.userID
RIGHT JOIN TVSeriesHasTVSeason
ON TVSeason.tvSeasonID = TVSeriesHasTVSeason.tvSeasonID
戻り値:
515 1769 1000 Ways to Die Season 1 3 Yes
515 1770 1000 Ways to Die Season 2 3 Yes
515 1772 1000 Ways to Die Season 4 3 Yes
515 1773 1000 Ways to Die Season 5 3 Yes
516 1774 2 Stupid Dogs Season 1 3 No
516 1775 2 Stupid Dogs Season 2 3 No
517 1777 24 Season 2 3 Yes
517 1779 24 Season 4 3 Yes
517 1780 24 Season 5 3 Yes
517 1781 24 Season 6 3 Yes
517 1782 24 Season 7 3 Yes
シーズン ID は連続しており、1000 通りの死に方のシーズン 3 が返されていないことがはっきりとわかります。24 のシーズンも返されていません。
このクエリの何が問題なのかわかりませんか?
****編集**私は問題の有効な解決策を見つけたと思います:**
SELECT x.*,
CASE
WHEN UserHasWatchedTVSeason.tvSeasonID IS NULL THEN 'No'
ELSE 'Yes'
END as watched
FROM
(SELECT
TVSeries.tvSeriesID, TVSeries.title,
TVSeriesHasTVSeason.tvSeasonID,
Users.userID
FROM TVSeries
LEFT JOIN TVSeriesHasTVSeason
on tvseries.tvSeriesID = TVSeriesHasTVSeason.tvSeriesID
LEFT JOIN TVSeason
on tvseason.tvSeasonID = TVSeriesHasTVSeason.tvSeriesID
CROSS JOIN Users)x
LEFT JOIN UserHasWatchedTVSeason
on x.tvSeasonID = UserHasWatchedTVSeason.tvSeasonID
AND x.userID = UserHasWatchedTVSeason.userID