我在加入一些表时遇到问题,继承我的结构:
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中的一个,它确实有效,但那不是我想要的。
答案 0 :(得分:0)
两种方法:
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差异:
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