具有多个内部连接的 MySQL 过滤


MySQL filtering with several inner joins

我目前正在努力找出解决我所遇到情况的方法。我将向您介绍数据库结构的一些背景知识:表"实体"包含列Ent_ID(AI,Int),Ent_Type(Enum,"位置,角色,房屋,军队")和Obj_ID(Int)。Obj_ID与相关表中的 ID 匹配。例如,"位置"表包含列Obj_ID(AI,Int),Loc_Name(文本)和Loc_Desc(文本)。

根据日期的不同,字符可以位于不同的位置,所以我有一个"时间敏感"表来存储这些东西。此表包含列TS_ID(AI、Int)、Ent_ID(Int)、TS_Start(Float)、TS_End(Float)和TS_Content(文本)。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>=?

因此,您可能已经看到,这目前仅在选择地点时考虑搜索过滤器。我现在也想在字符上实现搜索过滤器,但它需要显示不一定具有匹配名称但确实具有匹配名称的字符的地方。我希望这是有道理的。我当前的代码不会选择任何没有匹配名称的位置,因此没有机会搜索匹配的角色名称。

有没有办法将其合并到一个 sql 语句中?或者有人能想到一种方法来实现我想要做的事情吗?

任何帮助将不胜感激,如果您需要更多信息,请询问:)卡卢姆

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 ?

会给你所有需要的位置以及他们的名字