Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 跨多个表动态检索字段_Php_Mysql_Sql_Database Design - Fatal编程技术网

Php 跨多个表动态检索字段

Php 跨多个表动态检索字段,php,mysql,sql,database-design,Php,Mysql,Sql,Database Design,所以我有一个设计,把人分成小组,这些小组决定每个人保存的属性 因此,如果以后我决定要有VIP客户并记录他们的VIP号码,我可以创建一个名为“VIP会员”的新组,并使用属性“VIP_号码”将这些客户放入该组 因此,员工和其他客户没有与他们无关的字段 现在,对于给定的人员,从单独的表中获取所有所需数据的最佳方法是什么?我需要一个支持以后添加到的数据表的解决方案。 这是桌子的设计 注: “d”前缀用于数据表 “x”前缀用于交叉引用表 “p”前缀用于属性 我使用了不同长度的ID来帮助提高可读性 约翰·

所以我有一个设计,把人分成小组,这些小组决定每个人保存的属性

因此,如果以后我决定要有VIP客户并记录他们的VIP号码,我可以创建一个名为“VIP会员”的新组,并使用属性“VIP_号码”将这些客户放入该组

因此,员工和其他客户没有与他们无关的字段

现在,对于给定的人员,从单独的表中获取所有所需数据的最佳方法是什么?我需要一个支持以后添加到的数据表的解决方案。

这是桌子的设计

注:

  • “d”前缀用于数据表
  • “x”前缀用于交叉引用表
  • “p”前缀用于属性
  • 我使用了不同长度的ID来帮助提高可读性
  • 约翰·史密斯是一名员工,因此也是一名员工
  • Anna Backhouse是客户,因此也是个人
  • 先生既是雇员又是客户,因此也是个人
d人们

ID                   pFirst_Name          pLast_Name
----------------------------------------------------------
001                  John                 Smith
002                  Anna                 Backhouse
003                  Mr                   Both
dPeople_ID           dGROUPS_ID
----------------------------------------------------------
001                  2
002                  3
003                  2
003                  3
失业人员

ID                   pBadge_Code
----------------------------------------------------------
01                   MB2012
02                   JS2012
ID                   pPhone_Number
----------------------------------------------------------
01                   1800 backhouse
02                   1800 both
dPeople_ID           dEmployees_ID
----------------------------------------------------------
001                  02
003                  01
dPeople_ID           dCustomers_ID
----------------------------------------------------------
002                  01
003                  02
d客户

ID                   pBadge_Code
----------------------------------------------------------
01                   MB2012
02                   JS2012
ID                   pPhone_Number
----------------------------------------------------------
01                   1800 backhouse
02                   1800 both
dPeople_ID           dEmployees_ID
----------------------------------------------------------
001                  02
003                  01
dPeople_ID           dCustomers_ID
----------------------------------------------------------
002                  01
003                  02
d组

ID                   pGroup_Name
----------------------------------------------------------
1                    People
2                    Employees
3                    Customers
dGROUPS_ID_parent    dGROUPS_ID_child
----------------------------------------------------------
1                    1
1                    2
1                    3
xGROUPS

ID                   pGroup_Name
----------------------------------------------------------
1                    People
2                    Employees
3                    Customers
dGROUPS_ID_parent    dGROUPS_ID_child
----------------------------------------------------------
1                    1
1                    2
1                    3
xPeople

ID                   pFirst_Name          pLast_Name
----------------------------------------------------------
001                  John                 Smith
002                  Anna                 Backhouse
003                  Mr                   Both
dPeople_ID           dGROUPS_ID
----------------------------------------------------------
001                  2
002                  3
003                  2
003                  3
xEmployees

ID                   pBadge_Code
----------------------------------------------------------
01                   MB2012
02                   JS2012
ID                   pPhone_Number
----------------------------------------------------------
01                   1800 backhouse
02                   1800 both
dPeople_ID           dEmployees_ID
----------------------------------------------------------
001                  02
003                  01
dPeople_ID           dCustomers_ID
----------------------------------------------------------
002                  01
003                  02
x客户

ID                   pBadge_Code
----------------------------------------------------------
01                   MB2012
02                   JS2012
ID                   pPhone_Number
----------------------------------------------------------
01                   1800 backhouse
02                   1800 both
dPeople_ID           dEmployees_ID
----------------------------------------------------------
001                  02
003                  01
dPeople_ID           dCustomers_ID
----------------------------------------------------------
002                  01
003                  02
如果同时查找Mr,则需要得到以下结果:

ID    pFirst_Name  pLast_Name  pBadge_Code  pPhone_Number
----------------------------------------------------------
003   Mr           Both        MB2012       1800 both
如果查找John Smith,则需要获得以下结果:

ID    pFirst_Name  pLast_Name  pBadge_Code  
----------------------------------------------------------
001   John         Smith       JS2012     
如果查找Anna Backhouse,则需要的结果:

ID    pFirst_Name  pLast_Name  pPhone_Number
----------------------------------------------------------
002   Anna         Backhouse   1800 backhouse
我可以获得他们正在使用的所有组的列表:

SELECT `dGROUPS`.`ID` AS `Group ID`, `dGROUPS`.`pGroup_Name` AS `Group Name` FROM `dGROUPS`, `xGROUPS` WHERE `xGROUPS`.`dGROUPS_ID_parent` = `dGROUPS`.`ID` AND (`xGROUPS`.`dGROUPS_ID_child` IN (SELECT `dGROUPS_ID` FROM `xPeople` WHERE dPeople_ID = 003))
当我有更多的子组(如人员>员工>经理)时,这很有用

我想我需要运行这个查询,并使用它动态地形成另一个查询,以获得所需的结果。我不介意使用两个查询,但是最好使用一个

也许有一种使用视图的解决方案


我正在使用PHP和MySQL。

我修改了select子句、星号select all列,甚至是后来添加到表中的新列

两位先生:

  --select dp.ID, dp.pFirst_Name, dp.pLast_Name, de.pBadge_Code, dc.pPhone_Number
    select dp.*, dp.*, dp.*, de.*, dc.*
    from dPeople dp join xCustomers xc
      on dp.id = xc.dPeople_ID
    join dCustomers dc
      on xc.dCustomers_ID = dc.ID
    join xEmployees xe
      on dp.id = xe.dPeople_ID
    join dEmployees de
      on  xe.dEmployees_ID = de.ID

如果您不介意使用空列(您可以在php端处理它们),则无需使用动态查询即可获得所需的结果。这还允许您丢弃分组表:dGROUPS和xGROUPS不提供任何附加值仅出于此目的实体之间的关系已由实际数据给出,它们仅生成

这是一个使用postgres制作的示例(但您也可以使用mysql)


如果以后将新属性添加到表中,或者将一个人添加到另一个组中,则此操作不起作用。我需要一个动态的解决方案。