繁体   English   中英

三个表的内部联接与空表进行搜索

[英]three table inner join with empty table for searching

我的数据库结构如下 四张桌子

目前角色,组和库表都具有数据。 游戏表为空。

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

还有另一种我可能不知道的方式吗?

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

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

字符表保管库表

无需内部联接即可获取所需数据。 您可以简单地使用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注入攻击的好方法,从而确保永远不要将用户输入的数据直接放入SQL语句中。

自己想一想。 归一化的相对数据库中不应有冗余信息。 所有数据表都有列history 它不应具有冗余数据(可用于标识其他表中的行),而应具有对自己表中记录集的描述。 我们不知道vault_numbervault_number用的。 根据您的数据结构,所有其他表都可能直接连接到vault表。 只有您知道,建立此结构的意图是什么。

此外,您已通过具有group_name的冗余列将games连接到groups 您应该避免任何冗余,并为groups一个id 然后通过外来的group_id键将其连接到games 想象一下,当一个小组中有100场比赛,而您决定重命名一个小组或只是想纠正拼写错误时,将会发生什么。

为何不尝试将表加入表,而不加入表?

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

编辑:

该数组可以包含4个元素:

  1. vault_number
  2. 名称
  3. 历史
  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

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


考虑到Quasimodo的克隆对您的数据库规范化所做的解释,而Sgt AJ给出的方法可能会走很长一段路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM