SQLite查询结构。这可能是一对多关系,我不知道

时间:2013-09-04 00:55:19

标签: sql sqlite

好的,我认为我真的很喜欢我,所以请耐心等待我!

我有一个简单的SQLite表,其设置如下:

DROP TABLE IF EXISTS "game_authors";
CREATE TABLE "game_authors" ("key" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , "book_key" INTEGER NOT NULL  DEFAULT 0, "author_key" INTEGER NOT NULL  DEFAULT 0);

KEY | BOOK | AUTHOR
-------------------
1     1      1
2     2      5
3     2      6
4     3      2
5     4      5
6     4      6
7     5      10
8     6      11
9     9      14
10    10     9
11    11     4
12    22     4

我试图解决的搜索是找到作者的所有书籍。示例:我想要一个包含author_key = 5和author_key = 6的所有book_keys的列表。    也许它真的很容易,我无法在我面前看到它,但我无法弄明白。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

要获得一本有两位作者的书,您可以使用子查询来完成:

SELECT book_key
FROM game_authors
WHERE author_key = 5
  AND book_key IN (
    SELECT book_key
    FROM game_authors
    WHERE author_key = 6
    );

OR与同一个表的内部联接,将两者与book_key链接

SELECT a.book_key
FROM game_authors a
INNER JOIN game_authors b ON a.book_key = b.book_key
WHERE a.author_key = 5
  AND b.author_key = 6;

您可以查看this fiddle以查看其是否有效

答案 1 :(得分:1)

如果您想查找由同一作者撰写的所有图书,则可以使用INTERSECT。查询看起来像,

SELECT book_key FROM game_authors WHERE author_key = 5
INTERSECT
SELECT book_key FROM game_authors WHERE author_key = 6

这将获取作者#5的所有书籍列表,并将该列表与作者#6的书籍相交,给出两者书写的书籍列表。

您需要author_key列上的索引才能进行快速查找。为了避免额外的表查找从表中检索book_key,您可以在(author_key, book_key)上创建覆盖索引,以加快速度。

这是fiddle

答案 2 :(得分:0)

这将为您提供一位作者:

select * from game_authors where author_key = ?

如果你想了解更多的作者,你可以将其中的一堆结合在一起:

select book_key from game_authors where author_key = ?
UNION
select book_key from game_authors where author_key = ?
UNION
select book_key from game_authors where author_key = ?