坚持使用简单的子查询

时间:2014-07-12 21:48:07

标签: mysql subquery

我有2个表,第一个名为movie_list的表包含以下列:

  • id
  • actors
  • movie_id
  • imdb_id
  • 等...

名为movie_genre的第二个包含以下内容:

  • id
  • movie_id
  • genre_id

所以我做了一个简单的查询:

SELECT movie_list . * , movie_genre.genre_id
FROM movie_list, movie_genre
WHERE movie_genre.movie_id = movie_list.movie_id
AND movie_genre.genre_id
IN ( 12, 35, 878 ) 

它工作正常。

现在我想对此查询的结果做一些事情,就像一个简单的事情:

SELECT tbl1.movie_id FROM
(SELECT movie_list . * , movie_genre.genre_id
FROM movie_list, movie_genre
WHERE movie_genre.movie_id = movie_list.movie_id
AND movie_genre.genre_id
IN ( 12, 35, 878 ))as tbl1 

它不起作用

我被困了,我的子查询做错了什么?

1 个答案:

答案 0 :(得分:0)

您可以使用显式连接表示法重写您的第一个查询:

SELECT l.*, g.genre_id
  FROM movie_list AS l
  JOIN movie_genre AS g ON l.movie_id = g.movie_id
 WHERE g.genre_id IN (12, 35, 878)

然后,您应该能够将其作为子查询嵌入到FROM子句中:

SELECT t.movie_id
  FROM (SELECT l.*, g.genre_id
          FROM movie_list AS l
          JOIN movie_genre AS g ON l.movie_id = g.movie_id
         WHERE g.genre_id IN (12, 35, 878)
       ) AS t

但是,据我所知,这与您编写的查询是同构的。

你说"不工作,卡住"没有解释这意味着什么。说"不起作用"在SO方面存在问题。当你说"卡住"时,你的意思是它在合理的时间内没有返回任何数据吗?你应该澄清你的问题。

您可能需要指定正在使用的MySQL版本以及您正在使用的平台。

此外,每个表中有多少行,以及它们在哪里有索引?只要您有movie_list.movie_id(唯一)或movie_genre.movie_id(由于影片可以同时属于多种类型而允许重复)或两者都有索引,您就不会遇到严重的性能问题。