MySQL过滤有几个内连接

时间:2012-06-27 00:35:31

标签: php mysql sql pdo

我目前正在努力找到解决我所处的情况的方法。我将为您介绍数据库结构的一些背景知识: 表“实体”包含列 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

1 个答案:

答案 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 ?

将为您提供所有需要的位置及其名称

相关问题