php / sql - 高效联盟?

时间:2018-01-05 13:57:07

标签: php mysql

enter image description here我试图让这个查询更有效率,基本上它的作用是从不同的表中选择多个用户帐户到一个查询。我知道加入更有效率,但我很难理解它们出于某种原因。有没有其他有效的方法来缩短这段代码?或者我需要对表格进行调整吗?

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'

1 个答案:

答案 0 :(得分:1)

join不一样,并且不一定比union更有效率。对于您要显示的查询,union或更确切地说union all似乎是最佳解决方案。

您可能希望使用union all来获取所有匹配的记录。 union将对其进行重复数据删除,就像您select distinct一样。

但总的来说,这种模式是错误的。在这种情况下,您可以让一个名为bob的学生和一个名为bob的注册商,如果两者都选择了相同的密码,那么您将获得这两个密码。通过这种方式,您可能会冒着被学生侵入他人账户的风险(反之亦然)。

更好的模式是拥有一组帐户,您​​可以在其中管理帐户名称和密码哈希(而不是密码)。您可以将此类帐户链接到学生,注册商或教师(如果您的应用程序允许将多个角色绑定到单个用户名,则可以使用多个帐户)。

以这种方式建模会阻止两个不同的实体具有相同的登录名,因此也可以防止因碰撞用户名而导致的意外不良后果。