1

好吧,我觉得我真的有点过头了,所以请多多包涵!

我有一个简单的 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 的列表。也许这真的很容易,我无法在我面前看到它,但我无法弄清楚。任何帮助将不胜感激!

4

3 回答 3

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

或与同一个表的内部连接,将两者与 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;

您可以检查此小提琴以查看它是否正常工作

于 2013-09-04T01:35:20.017 回答
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)来加快速度。

这是一个小提琴

于 2013-09-04T02:57:25.037 回答
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 = ?

等等

于 2013-09-04T01:16:19.160 回答