[英]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_number
是vault_number
用的。 根据您的数据结构,所有其他表都可能直接连接到vault
表。 只有您知道,建立此结构的意图是什么。
此外,您已通过具有group_name
的冗余列将games
连接到groups
。 您应该避免任何冗余,并为groups
一个id
。 然后通过外来的group_id
键将其连接到games
。 想象一下,当一个小组中有100场比赛,而您决定重命名一个小组或只是想纠正拼写错误时,将会发生什么。
为何不尝试将表加入表,而不加入表?
编辑:
该数组可以包含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.