Php 带空表的三表内部联接用于搜索

Php 带空表的三表内部联接用于搜索,php,mysql,join,Php,Mysql,Join,我的数据库结构如下 目前,字符、组和vault表都有数据。然而,游戏桌是空的 是否可以在games表上编写一个内部连接,允许php搜索框从其他三个表中获取数据,即使games表中没有数据 有没有其他我可能不知道的方法 例如,我想为在游戏表上搜索的网页编写一个php搜索脚本。如果用户输入“Allistair Tenpenny”,它将从字符表中提取数据,并在搜索页面中显示字符名称及其历史记录,与搜索vault时显示vault表中的数据相同 根据我对内部联接的了解,每个联接表上的数据必须匹配才能显示

我的数据库结构如下

目前,字符、组和vault表都有数据。然而,游戏桌是空的

是否可以在games表上编写一个内部连接,允许php搜索框从其他三个表中获取数据,即使games表中没有数据

有没有其他我可能不知道的方法

例如,我想为在游戏表上搜索的网页编写一个php搜索脚本。如果用户输入“Allistair Tenpenny”,它将从字符表中提取数据,并在搜索页面中显示字符名称及其历史记录,与搜索vault时显示vault表中的数据相同

根据我对内部联接的了解,每个联接表上的数据必须匹配才能显示。还有别的办法吗


你自己想一想。规范化的相对数据库中不应有冗余信息。所有数据表都有一列
历史记录
。它不应该有冗余数据(您可以使用这些数据来标识其他表中的行),而应该有自己表中记录集的描述。我们不知道,
保险库编号
是干什么用的。所有其他表都可能直接连接到
vault
表,具体取决于您的数据结构。只有你知道,你建造这个建筑的意图是什么


此外,您还通过一个带有
组名称的冗余列将
游戏
连接到
。您应该避免任何冗余,并为
组提供
id
。然后通过一个外部
group\u id
键将其连接到
games
。想象一下,当一个组中有100个游戏,而您决定重命名一个组或只是想更正一个输入错误时,会发生什么情况。

获取所需数据不需要内部联接。您可以简单地使用php使用SQL根据用户输入搜索适当的表

如果页面上有多个搜索字段,只需对提交按钮进行不同的命名,然后让PHP检查表单中每个提交按钮的POST数据是否存在,然后执行适当的搜索。一个示例形式可能是:

<form action="" method="post">
    Search Character Name:<input type="text" name="charactername">
    <input type="submit" name="charsubmit" value="Search">
</form>
<form action="" method="post">
    Search Vault Name:<input type="text" name="vaultname">
    <input type="submit" name="vaultsubmit" value="Search">
</form>

使用这种预先准备好的语句是防止SQL注入攻击的好方法,从而确保用户输入的数据不会直接放入SQL语句。

与其加入表,为什么不尝试将它们添加到数组中

  • 使用需要显示的元素创建一个数组(不要忘记从所有表中添加相同数量的元素(不是从一个表中添加3个,从另一个表中添加4个)
  • 查询第一个表并使用“将其添加到数组”
  • 查询第二个表并将其添加到数组中
  • 继续添加所需的表
  • 显示阵列
  • 编辑:

    该数组可以由4个元素组成:

  • 保险库编号
  • 名字
  • 历史
  • 类型(它来自的表)
  • 查询示例如下:

    select vault_number, charactor_name as name, history, 'charactor' as type from charactor
    
    
    select vault_number, group_name as name, history, 'group' as type from groups
    
    您只需继续将其添加到数组中,然后就可以显示所有结果



    考虑到卡西莫多的克隆人对db规范化的解释,以及AJ中士给出的方法可能会有很大的帮助。

    你的问题没有真正的意义,但我将尝试进行评论。你可以使用连接来显示所有数据(来自其中一个或两个表),所以最后一句不是真的。从第四段开始,我假设您只希望脚本使用搜索字符串搜索所有表。在这种情况下,它们还有其他方法可以做到这一点。@davejal我还能怎么做呢?正如您所说,我可以用不同的方法来做?我试图通过多对多表来做。不确定是否要搜索所有表表格并从所有其他表格中获取结果,但仅从一个表格中获取结果。@Sgt AJ提供的解决方案几乎就是我所想的,但同样,这将只显示一个表格中的数据,需要3个按钮,而不是1个(用户更容易使用).从下面的评论来看,我仍然不确定你到底想要什么,但我会写一些你可以作为答案的计划。如果你发布了一些你拥有的数据、你想要搜索的内容以及搜索结果会是什么,这会很有帮助。如果用户可以获得现有角色的数据,那么应该有关于现有游戏的信息。为什么table empty?它是否意外丢失了数据?这给出了一些解释(主要是关于规范化和DB101),但没有提供答案。每个历史记录列都包含不同的信息,所以你是说我应该给每个历史记录列命名不同的名称?我还可以从vault表以外的所有其他表中删除vault编号。我还可以将组名称重命名为组ID,这会有帮助吗?@Ausghostdog-不,这不是我说的ng.每个表中可能仍有相同的命名列。内容不应重复。如果它是以非规范化方式设计的,则您可能能够通过该信息链接表。然后您应该这样做,只是为了生成游戏中缺少的数据,并在此之后规范结构。如果您的问题只是:“创建新游戏条目时,我可以阅读其他表格吗",然后答案是:只需不进行任何连接即可。让用户或随机数生成器选择一个条目,并将新条目的ID存储到
    games
    @Quasimodo's中。如果数据不重复,则每个表中的历史列中都有不同的信息和数据them@Ausghostdog-这是应该的,为什么你想获取数据吗?出于什么目的/在什么情况下?好的,谢谢你提供的信息,我将处理这个问题,并将添加消毒措施以防止人们丢弃表格。正如你自己已经说过的,永远不要放置用户数据…那么为什么不更新代码以显示pdo示例?但这是OP可以做到的
    select vault_number, charactor_name as name, history, 'charactor' as type from charactor
    
    
    select vault_number, group_name as name, history, 'group' as type from groups