[英]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.