使用 JOIN 的 MySQL 语法

标签 mysql sql join syntax many-to-many

我的 MySQL 数据库中有以下表格:

CREATE TABLES Films (  
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),   
Title VARCHAR(255)),  

CREATE TABLE Genres (  
id INT NOT NULL AUTO_INCREMENT,   
PRIMARY KEY(id),  
Name VARCHAR(255))

CREATE TABLE Films_Genres (
film_id INT NOT NULL,  
genre_id INT NOT NULL,  
PRIMARY KEY (film_id,genre_id),  
FOREIGN KEY (film_id) REFERENCES Films(id) ON UPDATE CASCADE,  
FOREIGN KEY (genre_id) REFERENCES Genres(id) ON UPDATE CASCADE)";  

我想搜索 $genre 存储的具有特定类型的电影。我还想选择这种类型的名称(不要问我为什么;))。我知道如何做第一部分。我试图用 JOIN 实现第二部分,但我的语法有问题:

SELECT * FROM Films WHERE id IN (    
SELECT film_id FROM Films_Genres  
WHERE genre_id IN SELECT id FROM Genres WHERE Name = '$genre'))  
JOIN Genres ON Name = '$genre'

错误消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行“JOIN Genres ON Name = 'Action'”附近使用的正确语法

最佳答案

应该这样写:

SELECT * 
FROM Films 
JOIN Genres ON id = genre_id
WHERE id IN 
(    
   SELECT film_id 
   FROM Films_Genres  
   WHERE genre_id IN (SELECT id FROM Genres WHERE Name = '$genre')
)   
AND Name = '$genre';

JOIN 应该位于 FROM 之后。

或者您可以直接 JOIN 表而不是这些 IN 谓词:

SELECT * 
FROM Films AS f
INNER JOIN Films_Genres AS fg ON f.id = fg.film_id
INNER JOIN Genres       AS g  ON g.id = fg.genre_id

WHERE g.Name = '$genre'

关于使用 JOIN 的 MySQL 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470774/

相关文章:

python - 在 Snow Leopard 上为 Python 2.7 安装 MYSQL-python-1.2.3 时出现问题

SQL查询,返回Max(DateField)的价格

mysql - 不确定这个右外连接的结果是什么

mysql 问题使用来自 json 字符串的连接来获取一个唯一值

php - 修复configuration.php后joomla数据库连接错误(2)

php - 对 mysql_real_escape_string 的每次调用都需要再次访问数据库吗?

sql - 如何获得可链接的标签?

c# - 将枚举存储到数据库的平滑方法

MySQL JOIN 覆盖原始表值

mysql - MVC 删除具有多个所需外键约束的记录