三个表内连接与空表进行搜索

时间:2016-05-15 01:36:39

标签: php mysql join

我的数据库结构如下 four tables

目前,字符,组和保险库表都有数据。但游戏表是空的。

是否有可能在游戏桌上编写内部联接,即使游戏桌中没有数据,也可以让php搜索框从其他三个表中获取数据?

还有其他方法可以做到这一点,我可能不知道吗?

例如,我想为搜索游戏桌的网页编写一个php搜索脚本。如果用户输入'Allistair Tenpenny',它将从字符表中提取数据并将其显示在搜索页面中,其中包含字符名称及其历史记录,如果有人搜索某个保险库,它将显示保险库表格中的数据。

根据我所读到的内连接,每个连接表上的数据必须匹配才能显示。还有另一种方法可以解决这个问题吗?

charactor table vault table

3 个答案:

答案 0 :(得分:2)

无需内连接即可获取所需数据。您可以简单地使用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>

您的PHP代码可以结构化为:

if (isset($_POST['charsubmit']))
{
    $stmt = $db->prepare("SELECT * FROM character_table WHERE character_name = ':mydata'");
    $stmt->bindParam(':mydata',$_POST['charactername']);
}
elseif (isset($_POST['vaultsubmit']))
{
    $stmt = $db->prepare("SELECT * FROM vault_table WHERE vault_name = ':mydata'");
    $stmt->bindParam(':mydata',$_POST['vaultname']);
}

$stmt->execute();

使用这样的预处理语句是防止SQL注入攻击的好方法,从而确保用户输入的数据 NEVER 直接放入SQL语句。

答案 1 :(得分:0)

自己想一想。规范化的相对数据库中不应存在冗余信息。所有数据表都有一列history。它不应该有冗余数据,您可以使用它来标识其他表中的行,但是应该使用自己的表中的记录集的描述。我们不知道vault_number是什么。所有其他表可能会直接连接到vault表,具体取决于您的数据结构。只有你知道,你建立这种结构的意图是什么。

您还通过包含games的冗余列将groupsgroup_name连接起来了。您应该避免任何冗余,并为groups id提供帮助。然后通过外部games密钥将其连接到group_id。想象一下,如果一个群组中有100个游戏并且你决定重命名一个群组或只是想纠正一个错字,会发生什么。

答案 2 :(得分:0)

为什么不尝试将它们添加到数组中而不是加入表?

  1. 创建一个包含您需要显示的元素的数组(不要忘记从所有表中添加相同数量的元素(不是3个表中的3个,而是来自另一个表中的4个)
  2. 查询第一个表并使用将其添加到数组
  3. 查询第二个表并将其添加到数组
  4. 继续添加您需要的表格
  5. 显示数组
  6. 编辑:

    数组可以包含4个元素:

    1. vault_number
    2. 名称
    3. 历史
    4. 类型(表格来自)
    5. 示例查询将是:

      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
      

      您只需继续将其添加到阵列中,然后就可以显示所有结果

      考虑到Quasimodo的克隆解释了你的数据库规范化以及中士AJ给出的方法可能会有很长的路要走。