Sqlite匹配多个标签

时间:2016-09-14 00:28:50

标签: sqlite

我们说我有三张桌子。

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。

有人有任何建议吗?

2 个答案:

答案 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'));