我们说我有三张桌子。
story table:
story_id, story_name, story_author
genre table:
genre_id, genre_name
pair table:
story_id, genre_id
如何制定一个SQL语句,找到所有具有浪漫类型和喜剧类型的故事。
我尝试过类似的事情:
SELECT * from pair
INNER JOIN story
ON story.story_id = pair.story_id
INNER JOIN genre
ON genre.genre_id = pair.genre_id
WHERE genre.name = "romance"
AND genre.name = "comedy"
但这不起作用,因为在返回的每一行中我只看到: story_id,story_name,story_author,genre_id,genre_name
每行只列出一个genre_name。
有人有任何建议吗?
答案 0 :(得分:1)
尝试这样的事情:
SELECT story.*
FROM story
INNER JOIN pair firstpair
ON firstpair.story_id = story.story_id
INNER JOIN genre firstgenre
ON firstgenre.genre_id = firstpair.genre_id
INNER JOIN pair secondpair
ON secondpair.story_id = story.story_id
INNER JOIN genre secondgenre
ON secondgenre.genre_id = secondpair.genre_id
WHERE firstgenre.name = 'romance' AND secondgenre.name = 'comedy'
这是一个笨拙的方式来获取浪漫和喜剧类型的所有故事,你也可以使用自定义功能来判断故事是否符合条件,但我不确定该功能是否是快速的方法它
希望这可以帮助~~答案 1 :(得分:0)
这相当于@ baiyangcao的答案,但是使用子查询而不是连接的查询可以更容易理解(并且效率不高):
SELECT *
FROM story
WHERE story_id IN (SELECT story_id
FROM pair
JOIN genre USING (genre_id)
WHERE genre.name = 'comedy')
AND story_id IN (SELECT story_id
FROM pair
JOIN genre USING (genre_id)
WHERE genre.name = 'romance');
可以使用相同的构造来删除剩余的连接,但这可能不值得:
SELECT *
FROM story
WHERE story_id IN (SELECT story_id
FROM pair
WHERE genre_id = (SELECT genre_id
FROM genre
WHERE name = 'comedy'))
AND story_id IN (SELECT story_id
FROM pair
WHERE genre_id = (SELECT genre_id
FROM genre
WHERE name = 'romance'));