MySQL加入&搜索

时间:2012-08-02 22:14:30

标签: mysql join

我在加入一些表时遇到问题,继承我的结构:

tbl_imdb:
fldID   fldTitle    fldImdbID
1       Moviename   0000001

tbl_genres:
fldID   fldGenre
1       Action
2       Drama

tbl_genres_rel:
fldID   fldMovieID  fldGenreID
1       1           1
2       1           2

我想要做的是一个查询,它会找到所有既是动作片也有戏剧的电影,这可能没有子查询,如果有的话,怎么办?

我现在正在尝试的是:

SELECT tbl_imdb.*
FROM tbl_imdb
LEFT JOIN tbl_imdb_genres_rel ON ( tbl_imdb.fldID = tbl_imdb_genres_rel.fldMovieID ) 
LEFT JOIN tbl_imdb_genres ON ( tbl_imdb_genres_rel.fldGenreID = tbl_imdb_genres.fldID ) 
WHERE tbl_imdb_genres.fldGenre =  'Drama'
AND tbl_imdb_genres.fldGenre =  'Action';

但是这个dosnt工作,但如果我只保留两个WHERE中的一个,它确实有效,但那不是我想要的。

2 个答案:

答案 0 :(得分:0)

两种方法:

1

SELECT     tbl_imdb.*
FROM       tbl_imdb
INNER JOIN tbl_genres_rel            rel_action  
ON         tbl_imdb.fldID          = rel_action.fldMovieID 
INNER JOIN tbl_genres                genre_action
ON         rel_action.fldGenreId   = genre_action.fldID 
AND        'Action'                = genre_action.fldGenre
INNER JOIN tbl_genres_rel            rel_drama  
ON         tbl_imdb.fldID          = rel_drama.fldMovieID 
INNER JOIN tbl_genres                genre_drama
ON         rel_drama.fldGenreId    = genre_drama.fldID 
AND        'Drama'                 = genre_drama.fldGenre

此方法与原始解决方案位于同一路径上。 2差异:

  1. 连接应该是内部的,而不是因为你想要获得肯定具有相应类型条目的电影而
  2. 由于你想找到2个不同的类型,你必须与tbl_genres_rel和tbl_genres一起进行两次加入,对于你感兴趣的每个特定类型一次。
  3. 2

    SELECT     tbl_imdb.*
    FROM       tbl_imdb
    INNER JOIN tbl_genres_rel              
    ON         tbl_imdb.fldID            = tbl_genres_rel.fldMovieID 
    INNER JOIN tbl_genres                
    ON         tbl_genres_rel.fldGenreId = tbl_genres.fldID 
    AND        tbl_genres.fldGenre      IN ('Action', 'Drama')
    GROUP BY   tbl_imdb.fldID
    HAVING     COUNT(*) = 2
    

    同样,基本的连接计划是相同的。这里的区别是我们只加入tbl_genres_rel和tbl_genres路径一次。这本身就可以获取一部电影的所有类型,然后过滤您感兴趣的一部分。对于每个不同的值tbl_imdb.fldId,符合条件的那些将拥有2行。 GROUP BY聚合在一起,将其展平为一行。通过在HAVING子句中声明我们只有2行,我们确保只保留那些具有两种类型的行。

    (请注意,这假设tbl_genres_rel上有{fldMovieID,fldGenreID}的唯一约束。如果不存在这样的约束,则应考虑添加它。)

答案 1 :(得分:0)

LEFT JOIN不适用于您的情况,因为两个表上都应存在记录。你需要count电影的实例

SELECT  *
FROM    tbl_imdb a 
            INNER JOIN tbl_genres_rel b
                on a.fldID = fldMovieID
            INNER JOIN tbl_genres c
                on c.fldGenreID = b.fldID
WHERE   c.fldGenre IN ('Drama', 'Action')
GROUP BY a.Moviename
HAVING COUNT(*) > 1