SQL获取除name = variable

时间:2016-09-01 07:17:49

标签: mysql

我有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 = ? ' .
        ;

我在想我应该使用外部联接,但我不确定这是否是最好的方法。

真的很感激任何帮助!

非常感谢提前

2 个答案:

答案 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')

SQL Fiddle

您的代码中的一个错误是在第一个连接中,您使用了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)' .
        ;