我有3个表'movie', 'movie_country_restriction', 'countries'。例如,我有一部电影,而这部电影在美国是受限制的。
下面是一个虚拟数据的例子:
电影
id - name
96 -电影A
97 -电影B
98 -电影C
movie_country_restriction
movieId - countryId
98 - 61
96 - 24
96 - 61
97 - 1
国家id - name
1 - france
24 - usa
61 -德国
现在我的目标是选择所有的电影,但留下那些有限制。
编辑
所以我的目标是得到"电影B"one_answers"电影C",因为在美国没有限制。如果我使用德国作为参数,我应该只得到'电影B',因为电影A和B在德国受到限制
这是我现在的查询。它是有效的,但一旦有多个国家限制一部电影,它就不起作用了。
$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 = ? ' .
;
我想我应该使用外连接,但我不确定这是否是最好的方法来处理这个。
任何帮助都是非常感激的!
提前致谢
对于您提供的数据,答案可以是
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')
SQL小提琴您的代码中的一个错误是在第一个连接中,您使用了m.id = mcr.countryId
同时,为了使所有的影片不被阻塞,你不能使用内连接。
编辑我已经根据你的评论修改了我的答案
试一下,希望对你有帮助。
$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)' .
;