0

我在加入一些表格时遇到问题,这是我的结构:

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';

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

4

2 回答 2

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
于 2012-08-02T22:24:24.833 回答
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 进行两次连接,对于您感兴趣的每个特定流派一次。

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 路径一次。这本身会获取一部电影的所有类型,然后过滤出您感兴趣的类型。符合条件的那些现在将有 2 行用于 tbl_imdb.fldId 的每个不同值。GROUP BY 对此进行聚合,将其压平为一行。通过在HAVING子句中断言我们正好有 2 行,我们确保我们只保留那些同时具有两种类型的行。

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

于 2012-08-02T22:19:20.657 回答