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 (Text) 和Loc_Desc (Text) 列。

根据日期,字符可以位于不同的位置,所以我有一个“ TimeSensitives ”表来存储这些东西。该表具有列TS_ID (AI, Int)、Ent_ID (Int)、TS_Start (Float)、TS_End (Float) 和TS_Content (Text)。Ent_ID是哪个字符是一些信息(例如位置)。该位置的 Ent_ID 进入TS_Content

因此,正如您可能想象的那样,我有许多地点,每个地点在不同的日期都有不同的字符。我的问题是我想搜索一个位置,该位置要么具有名称 LIKE 搜索过滤器,要么有一个名称具有名称 LIKE 搜索过滤器的字符。

到目前为止,我已经遍历了类型为“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

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 回答