我有3张桌子'电影','movie_country_restriction','国家'。 例如,我有一部电影,而且这部电影在美国受到限制。
以下是虚拟数据的示例:
电影
id - name
96 - 电影A
97 - 电影B
98 - 电影C
movie_country_restriction
movieId - countryId
98 - 61
96 - 24
96 - 61
97 - 1
国家
id - name
1 - 法国
24 - 美国
61 - 德国
现在我的目标是选择所有电影但忽略限制。
所以我的目标是获得'电影B'和'电影C',因为对美国的人没有限制。如果我使用德国作为参数,我应该只获得“电影B”,因为电影A和B在德国受到限制
这是我现在的查询。它可以工作,但只要有多个国家限制在1部电影上它就不起作用。
$query = 'SELECT m.* FROM movie m ' .
'INNER JOIN movie_country_restriction mcr ON m.id = mcr.countryId ' .
'INNER JOIN countries c ON c.id = mcr.countryId ' .
'WHERE c.name = ? ' .
;
我在想我应该使用外部联接,但我不确定这是否是最好的方法。
真的很感激任何帮助!
非常感谢提前
答案 0 :(得分:1)
对于您提供的数据,答案可能是
SELECT * FROM movie m
WHERE id NOT IN (SELECT movieID from movie_country_restriction mcr
LEFT JOIN countries c ON mcr.countryID=c.id
WHERE c.name LIKE 'USA')
您的代码中的一个错误是在第一个连接中,您使用了m.id = mcr.countryId
此外,要使所有电影都不被屏蔽,您无法使用内连接。
修改强> 我根据你的评论改变了我的答案。
答案 1 :(得分:-1)
试试这个,希望它会有所帮助。
$query = 'SELECT m.* FROM movie m ' .
'LEFT JOIN movie_country_restriction mcr ON m.id = mcr.countryId '.
'LEFT JOIN countries c ON c.id = mcr.countryId ' .
'WHERE c.name not in ( select distinct name from countries)' .
;