0

私は(少なくとも私にとっては)複雑なSQLクエリを作成しようとしていますが、どこから始めればよいのか本当にわかりません。

基本的に、私はキャラクターオブジェクトを持っており、各キャラクターはいくつかの部分で構成することができます。例えば:

指標表:

id | character
--------------
1  | 你
2  | 是
3  | 有

character_partsテーブル:

id | character_id | part_id
---------------------------
1  | 1            | 4
2  | 1            | 9
3  | 1            | 5
4  | 2            | 2
5  | 2            | 34
6  | 2            | 43
7  | 3            | 21
8  | 3            | 16
9  | 3            | 41
10 | 3            | 43

だから私はそれを知っています:

Character 1 is made of parts 4, 9, 5
Character 2 is made of parts 2, 34, 43
Character 3 is made of parts 21, 16, 41, 43

ここで、指定した部分で終わるすべての文字を選択します。

たとえば、「16、41、43」で終わるすべての文字を選択すると、文字3が表示されます。「43」で終わるすべての文字を選択すると、文字3と4が表示されます。

サブクエリを使用してクエリを作成する必要があると思いますが、どのように開始するか、またはそれを実行できるかどうかはわかりません。これまでのところ、必要なパーツIDを含むすべてを選択し、プログラムで比較を行っていますが、必要以上に選択しているため、これは遅すぎます。

なにか提案を?

4

4 に答える 4

0

group_concatあなたは機能 を試すことができます: http ://www.sqlite.org/lang_aggfunc.html

SELECT group_concat(part_id) FROM character_parts WHERE character_id=1

クエリはを返す必要があります4,9,5

問題は、によって使用される順序group_concatが任意であるということです。

Sqlitegroup_concatの順序

positionしたがって、パーツの順序を定義するフィールドがあるとすると、次のようにクエリを更新できます。

SELECT group_concat(part_id) FROM (SELECT part_id FROM character_parts WHERE character_id=1 ORDER BY position ASC)

クエリは4,9,5、定義された順序でパーツを正確に返します。

この値が得られたので、通常の文字列のように検索できます。LIKE特定の文字列で終わるすべての値を検索する場合は、演算子を使用できます。

最後に、クエリは次のようになります。

SELECT character_id, parts_concat FROM (
    SELECT character_id, group_concat(part_id) FROM (
        SELECT character_id, part_id FROM character_parts WHERE ORDER BY position ASC
    ) GROUP BY character_id
) parts
WHERE parts_concat LIKE '%,9,5'
于 2012-04-29T09:06:48.123 に答える
0

from_end最後から数える別の列を追加します。たとえば、次のようになります。

from_end | id | character_id | part_id
--------------------------------------
      2  | 1  | 1            | 4
      1  | 2  | 1            | 9
      0  | 3  | 1            | 5
      2  | 4  | 2            | 2
      1  | 5  | 2            | 34
      0  | 6  | 2            | 43
      3  | 7  | 3            | 21
      2  | 8  | 3            | 16
      1  | 9  | 3            | 41
      0  | 10 | 3            | 43

次に、次のことができます。

SELECT p0.character_id
  FROM character_parts AS p0
  JOIN character_parts AS p1 USING (character_id)
  JOIN character_parts AS p2 USING (character_id)
 WHERE p0.from_end = 0 AND p1.from_end = 1 AND p2.from_end = 2
   AND p0.part_id = 43 AND p1.part_id = 41 AND p2.part_id = 16
于 2012-04-29T08:59:33.977 に答える
0

クエリは次のようになります。

select * from character where id in (select character_id from character_parts where character_id = 'required no' AND character_id = 'required no' AND character_id = 'required no')
//required number is the part_id you want to specify.
于 2012-04-29T08:48:29.850 に答える
0
SELECT  c.character
FROM    character_parts cp
JOIN    character c
ON      c.id = cp.character_id
WHERE   cp.part_id = 43
        AND cp.id =
        (
        SELECT  id
        FROM    character_parts cpo
        WHERE   cpo.character_id = cp.character_id
        ORDER BY
                id DESC
        )

次のインデックスを作成します。

character_parts (part_id, character_id, id)
character_parts (character_id, id)

これが速く動作するために

于 2012-04-29T09:17:04.543 に答える