2015-06-21 170 views
-2

我有这些表,并在一个带有用户名和密码的查询(登录时)我想从右表中选择数据。 例如:在用户表中有字段权限。 管理员拥有权限1,供应商拥有权限2,并且客户拥有权限3. 谢谢。我需要MYSQL查询解决方案

+------------+--+----------+--+-----------+--+-------------+ 
| user | | admin | | vendor | | customer | 
+------------+--+----------+--+-----------+--+-------------+ 
| id_user | | id_admin | | id_vendor | | id_customer | 
| username | | id_user | | id_user | | id_user  | 
| password | | name  | | name  | | name  | 
| permission | | surname | | surname | | surname  | 
+------------+--+----------+--+-----------+--+-------------+ 
+1

很明显,您的解决方案将会是一些带有一些JOIN子句的SQL语句,但在您更好地解释关系需求之前,不可能专门为您提供帮助。 'user.permission'如何映射到'admin'“权限”? –

+0

好的谢谢。我试过了,它适用于这些查询。 $ query =“SELECT * FROM user INNER JOIN admin ON admin.id_user = user.id_user WHERE user ='$ username'and password ='$ password'limit 1”;但我会添加 “如果(权限== 1)为管理员或如果(权限== 2)供应商或如果(权限== 3)为客户” 并执行单个查询,使自动选择正确的表,检索数据。 – Miks

+0

基于像这样的列值对不同表进行条件连接被认为是非常糟糕的做法,并且通常在不正确的关系数据库设计中存在根本原因。可以将它压缩为仅仅一个SQL查询,但是它会很昂贵(每次总是不需要2个连接时会加入3个连接),并且需要对结果进行空检查。如果不进行任何模式更改,最好将其作为2阶段查询。首先查询用户表,然后根据第一个查询结果的'permission'值,仅查询所需的表。 –

回答

1

要跟进我的意见,没有理由(不包括大量的重构时间承诺)这4个表无法被非归到一个表中的所有相同的信息如下:

+------------+ 
| user | 
+------------+ 
| id_user | 
| username | 
| password | 
| permission | 
| name  | 
| surname | 
+------------+ 

这里permission代表用户类型(管理员,供应商或客户)。如果用户可能属于多个类别(例如,用户既是客户又是供应商),那么您可以将permission视为(bit) flag field(或者您可以将其分成3个独立的布尔字段is_X)。这样做有许多下游收益,可能并不明显。例如,您现在将一个id_user外键转换为任何其他相关表,而不是可能的4个不同的外键。

总是试图记住的关系数据库设计,经过时间考验的规则:“正常化,直到它伤害,然后去正常化,直到它的工作原理”。去归一化的动机几乎总是昂贵的查询,需要不断的JOIN或不必要的密钥分叉。