0

私は現在、私がいる状況の解決策を見つけるのに苦労しています。データベース構造の背景を説明します: テーブル 'エンティティ' には列Ent_ID (AI, Int), Ent_Type (Enum, 'Locations, Characters, Houses, Armies') およびObj_ID (Int)。Obj_ID は、関連するテーブルの ID と一致します。たとえば、「Locations」テーブルには、列 Obj_ID (AI、Int)、Loc_Name (テキスト)、およびLoc_Desc (テキスト) があります。

キャラクターは日付によって異なる場所にいる可能性があるため、これらの種類のものを格納するための「TimeSensitives」テーブルがあります。このテーブルには、列TS_ID (AI、Int)、Ent_ID (Int)、TS_Start (Float)、TS_End (Float)、およびTS_Content (Text) があります。Ent_IDは、何らかの情報 (場所など) である文字です。ロケーションの Ent_ID は TS_Content に入ります

ご想像のとおり、さまざまな日付にさまざまなキャラクターが登場する場所がたくさんあります。私の問題は、検索フィルターのような名前を持つ場所、または検索フィルターのような名前を持つ文字がある場所を検索したいということです。

これまで、「場所」タイプの各エンティティをループしてから、現在そこにあるすべての文字をループしました。これは私のコードです:

SELECT * 
FROM Entities 
INNER JOIN Locations 
ON Entities.Obj_ID=Locations.Obj_ID 
WHERE Entities.Ent_Type='Locations' 
    AND Loc_Name LIKE ?

次に、それぞれについて:

SELECT * 
FROM TimeSensatives 
INNER JOIN Entities 
ON TimeSensatives.Ent_ID=Entities.Ent_ID 
INNER JOIN Characters 
ON Entities.Obj_ID=Characters.Obj_ID 
WHERE TS_Type='Location' 
    AND TS_Content=? 
    AND TS_Start<=? 
    AND TS_End>=?

ご覧のとおり、現在のところ、場所を選択するときに検索フィルターのみが考慮されます。文字にも検索フィルターを実装したいと思いますが、必ずしも名前が一致するわけではなく、名前が一致する文字がある場所を表示する必要があります。それが理にかなっていることを願っています。私の現在のコードは、一致する名前のない場所を選択しないため、一致するキャラクター名を検索する機会がありません。

これを 1 つの SQL ステートメントに結合する方法はありますか? または、誰かが私がやろうとしていることを達成する方法を考えることができますか?

何か助けがあれば大歓迎です。さらに情報が必要な場合は、お問い合わせください:) Kallum

4

1 に答える 1

2
SELECT
  Entities.*,
  Locations.Loc_Name as Loc_Name
FROM
  Entities
  INNER JOIN Locations ON Entities.Obj_ID=Locations.Obj_ID 
WHERE
  Entities.Ent_Type='Locations' 
  AND Loc_Name LIKE ?

UNION

SELECT
  LocEnt.*,
  Locations.Loc_Name as Loc_Name
FROM 
  TimeSensatives
  INNER JOIN Entities AS CharEnt ON TimeSensatives.Ent_ID=CharEnt.Ent_ID
  INNER JOIN Characters ON Entities.Obj_ID=Characters.Obj_ID
  INNER JOIN Entities AS LocEnt ON TS_Content.Ent_ID=LocEnt.Ent_ID
  INNER JOIN Locations ON LocEnt.Obj_ID=Locations.Obj_ID 
WHERE
  TS_Type='Location' 
  AND TS_Start<=?
  AND TS_End>=?
  AND Char_Name LIKE ?

必要なすべての場所とその名前が表示されます

于 2012-06-27T00:52:37.813 に答える