我试图让这个查询更有效率,基本上它的作用是从不同的表中选择多个用户帐户到一个查询。我知道加入更有效率,但我很难理解它们出于某种原因。有没有其他有效的方法来缩短这段代码?或者我需要对表格进行调整吗?
select id_number, password from students
where
id_number = '$username' AND password = '$password'
union
select id_number, password from faculty
where
id_number = '$username' AND password = '$password'
union
select id_number, password from registrar
where
id_number = '$username' AND password = '$password'
答案 0 :(得分:1)
join
不一样,并且不一定比union
更有效率。对于您要显示的查询,union
或更确切地说union all
似乎是最佳解决方案。
您可能希望使用union all
来获取所有匹配的记录。 union
将对其进行重复数据删除,就像您select distinct
一样。
但总的来说,这种模式是错误的。在这种情况下,您可以让一个名为bob的学生和一个名为bob的注册商,如果两者都选择了相同的密码,那么您将获得这两个密码。通过这种方式,您可能会冒着被学生侵入他人账户的风险(反之亦然)。
更好的模式是拥有一组帐户,您可以在其中管理帐户名称和密码哈希(而不是密码)。您可以将此类帐户链接到学生,注册商或教师(如果您的应用程序允许将多个角色绑定到单个用户名,则可以使用多个帐户)。
以这种方式建模会阻止两个不同的实体具有相同的登录名,因此也可以防止因碰撞用户名而导致的意外不良后果。