【问题标题】:Get single row from either of two tables从两个表中的任何一个中获取单行
【发布时间】:2019-11-22 16:28:04
【问题描述】:

我有一个供管理员和用户使用的登录页面。他们都使用相同的表单,并且包含电子邮件和密码字段。

除了 admins 表名为 admins 和 users 表名为 users 之外,数据库表是相同的。电子邮件字段对两者都是唯一的,例如,如果电子邮件“test@example.com”在users 表中,则它不会在admins 表中。

从两个表中获取行、返回该行并检查它从哪个表中获取的最佳方法是什么?

联合、连接、2 个SELECT 查询,或者其他可以执行得更快、更高效的方法?

SELECT * FROM admins
UNION
SELECT * FROM users
WHERE email = :email

或者两个选择:

$row = SELECT * FROM admins WHERE email = :email LIMIT 1
if(!$row) {
    $row = SELECT * FROM users WHERE email = :email LIMIT 1
}

// Then I want to do redirect them according to what type of user they are:
if(row comes from admins table) {
    header('Location: /admins');
} else {
    header('Location: /users');
}

也许其他方式?

【问题讨论】:

  • 通常你会有一个user 表和一个role 表(当然还有一个链接表)- 将所有用户(和管理员)粘贴到user 表中然后交叉引用他们到他们的角色,看看他们被允许做什么......

标签: php mysql join select union


【解决方案1】:

首先,您应该有一个用户信息表,并添加一个角色表来区分管理员和普通用户。但如果你不能这样做,有一个解决方案。

 SELECT a.* , 'admin' as role FROM admins a
 UNION
 SELECT u.* , 'user' as role FROM users u
 WHERE email = 'abc@email.com'

“角色”列将告诉您从哪个表中获取值。

【讨论】:

    【解决方案2】:

    这肯定行得通:

    $row = 'SELECT * FROM admins WHERE email = :email LIMIT 1';
    if(!empty($row) header('Location: /admins');
    
    $row = 'SELECT * FROM users WHERE email = :email LIMIT 1';
    if(!empty($row)) header('Location: /users');
    

    显然,您不能只是拿起和放下此代码,但它的工作原理就在那里,例如,我不确定您如何连接到数据库,所以我不想要预先编写对您的情况无用的代码。

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 2021-06-23
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多