我目前正在努力找到解决我所处的情况的方法。我将为您介绍数据库结构的一些背景知识: 表“实体”包含列 Ent_ID (AI,Int), Ent_Type (枚举,“地点,字符,房屋,军队”)和< strong> Obj_ID (Int)。 Obj_ID匹配相关表中的ID。例如,“位置”表包含Obj_ID(AI,Int), Loc_Name (文本)和 Loc_Desc (文本)列。
根据日期,字符可以位于不同的位置,因此我有一个' TimeSensitives '表来存储这些东西。此表包含 TS_ID (AI,Int), Ent_ID (Int), TS_Start (Float), TS_End 列(浮动)和 TS_Content (文本)。 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
答案 0 :(得分: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 ?
将为您提供所有需要的位置及其名称