2015-10-07 59 views
1

我有一个很大的电影数据库,我想按年份和类型搜索电影。MySQL左连接1结果为非常大的数据库

我有3个表来处理:

1. movies (Key TITLE_ID) 
2. movie2genre (TITLE_ID + GENRE_ID) 
3. genre (Key GENRE_ID) 

电影:

+----------+---------------+------+ 
| TITLE_ID |  TITLE  | YEAR | 
+----------+---------------+------+ 
| 10001 | Matrix  | 1999 | 
| 10002 | Walk on Water | 2004 | 
+----------+---------------+------+ 

movie2genre:

+----------+----------+ 
| TITLE_ID | GENRE_ID | 
+----------+----------+ 
| 10001 | 1  | 
| 10001 | 2  | 
| 10002 | 2  | 
| 10002 | 4  | 
| 10001 | 3  | 
+----------+----------+ 

流派:

+----------+-----------+ 
| GENRE_ID | GENRE_TXT | 
+----------+-----------+ 
| 1  | Action | 
| 2  | Adventure | 
| 3  | Thriller | 
| 4  | Fantasy | 
+----------+-----------+ 

用户发送1999年的类型冒险或惊悚的请求。

如何在1个优化查询中查找所有电影?

结果应该是:

+----------+--------+------+-----------+ 
| TITLE_ID | TITLE | YEAR | GENRE_TXT | 
+----------+--------+------+-----------+ 
| 10001 | Matrix | 1999 | Action | 
+----------+--------+------+-----------+ 

我不在乎哪个流派被选中,只是这部电影为体裁的1用户要求。

回答

1

您可以尝试将3个表格连接在一起,然后使用您对年份和电影流派的要求限制WHERE子句的查询。下面的查询将只返回一条记录,您指定的记录是可以接受的。

SELECT m.TITLE_ID, m.TITLE, m.YEAR, g.GENRE_TXT 
FROM movies m 
INNER JOIN movie2genre mg ON m.TITLE_ID = mg.TITLE_ID 
INNER JOIN genre g ON mg.GENRE_ID = g.GENRE_ID 
WHERE m.YEAR = 1999 AND g.GENRE_TXT IN ('Adventure', 'Thriller') 
+0

我会删除LIMIT ... OP需要所有电影...只是他的示例数据只会从显示内容返回1。 (但upvoted准确查询,否则) – DRapp

+0

@DjRapp感谢您指出了这一点,为upvote。 –

+0

谢谢!工作很好。我只是添加“GROUP BY m.TITLE_ID”以获得1个结果的电影。 – TheWiz