Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 MySQL动态表名关系_Php_Mysql_Relationship_Relation - Fatal编程技术网

Php MySQL动态表名关系

Php MySQL动态表名关系,php,mysql,relationship,relation,Php,Mysql,Relationship,Relation,我有3个MySQL表:汽车、用户和访客 桌上汽车可以与桌上用户或桌上访客相关。表用户和访问者具有不同的表结构。我想连接所有这些表并检索人员数据。目前我正在使用PHP检索个人数据 这是创建此类关系的最佳表结构吗?是否有一种方法可以使用单个MySQL查询检索人员信息 [cars] id | car_name | person_type | person_id --------------+-------------+-------- 1 | car 1 | user | 1 2

我有3个MySQL表:汽车、用户和访客

桌上汽车可以与桌上用户或桌上访客相关。表用户和访问者具有不同的表结构。我想连接所有这些表并检索人员数据。目前我正在使用PHP检索个人数据

这是创建此类关系的最佳表结构吗?是否有一种方法可以使用单个MySQL查询检索人员信息

[cars] id | car_name | person_type | person_id --------------+-------------+-------- 1 | car 1 | user | 1 2 | car 2 | visitor | 1 [users] id | name ---+---------- 1 | person 1 [visitors] id | first_name | last_name ---+------------+---------- 1 | person | 2 [汽车] id |车名|人类型|人id --------------+-------------+-------- 1 |汽车1 |用户1 | 2 |车2 |访客| 1 [用户] id |名称 ---+---------- 1人1人 [访客] id |名|姓 ---+------------+---------- 1 |人| 2
您可以使用这样的外部联接:

select
    a.ID,
    a.car_name,
    a.person_type,
    b.name as username,
    c.name as visotorName
from
    cars a
        left outer join users b
            on a.person_id=b.ID
        left outer join visitors c
            on a.person_id=c.ID
select * from
   cars a
   left join users u on (a.person_type='user' and a.person_id=u.id)
   left join visitors v on (a.person_type='visitor' and a.person_id=v.id)

我写了一篇关于一个非常相似的问题的文章,你可能也想快速阅读一下。它还显示了一些其他函数,您可以使用这些函数按照返回的行数以及每行返回的内容来很好地格式化数据。

有几个选项可用。一个是在帖子中提到的。select将如下所示:

select
    a.ID,
    a.car_name,
    a.person_type,
    b.name as username,
    c.name as visotorName
from
    cars a
        left outer join users b
            on a.person_id=b.ID
        left outer join visitors c
            on a.person_id=c.ID
select * from
   cars a
   left join users u on (a.person_type='user' and a.person_id=u.id)
   left join visitors v on (a.person_type='visitor' and a.person_id=v.id)
另一个选项是代替
person\u type
person\u id
只需同时拥有
user\u id
visitor\u id
。两者都可以为null,您甚至可以在它们上放置一个强外键。选择是非常相似的:

select * from
   cars a
   left join users u on (a.user_id=u.id)
   left join visitors v on (a.visitor_id=v.id)
最后但并非最不重要的一点,也许您可以将
用户
访问者
表合并到一个表中

[cars]
  ID | car_name |  person_id
-----+----------+-------------
   1 | car 1    | 1
   2 | car 2    | 2

[persons]
  ID | type    | name
-----+---------+----------
   1 | user    | person 1
   2 | visitor | person 2
然后,选择变得超级简单:

select * from cars c join persons p on (c.person_id=p.id)