簡體   English   中英

MySQL過濾有幾個內連接

[英]MySQL filtering with several inner joins

我正在努力找出解決我所處的情況的方法。我將給你一些關於數據庫結構的背景知識:表' Entities '有列Ent_ID (AI,Int), Ent_Type (枚舉,'位置,人物,房屋,軍隊')和Obj_ID (國際)。 Obj_ID匹配相關表中的ID。 例如,“ 位置 ”表具有列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

因此,正如您可能想象的那樣,我在不同的日期有許多位置,每個位置都有不同的字符。 我的問題是我想要搜索一個名稱與搜索過濾器相似的位置,或者在那里有一個名稱與搜索過濾器相似的字符。

到目前為止,我已經使用“Locations”類型循環遍歷每個實體,然后對於每個實體,我已經遍歷了當前所有字符。 這是我的代碼:

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>=?

正如您可能已經看到的那樣,這在選擇場所時目前僅考慮搜索過濾器。 我現在想要對字符實現搜索過濾器,但是它需要顯示不一定具有匹配名稱但具有匹配名稱的字符的地方。 我希望這是有道理的。 我當前的代碼不會選擇任何沒有匹配名稱的位置,因此沒有機會搜索匹配的字符名稱。

有沒有辦法將它組合成一個sql語句? 或者有人能想出一種方法來實現我想要做的事情嗎?

任何幫助將不勝感激,如果您需要更多信息,請問:) Kallum

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 ?

將為您提供所有需要的位置以及他們的名字

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM