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

同じ著者によって書かれたすべての本を見つけたい場合は、 を使用できます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 に答える
1

2 人の著者の本を取得するには、サブクエリを使用して実行できます。

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 同じテーブルとの内部結合を使用し、2 つを 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 に答える
0

これにより、作成者が 1 人になります。

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 に答える