MySQL动态表名称关系

时间:2012-08-21 10:11:36

标签: php mysql relationship relation

我有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

2 个答案:

答案 0 :(得分:1)

您可以使用这样的外部联接:

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

我在一个非常相似的问题上写了一篇相当detailed answer的内容,你可能也想快速阅读一下。它显示了一些其他函数,您可以根据返回的行数以及每行返回的内容,以您希望的方式很好地格式化数据。

答案 1 :(得分:1)

有几种选择。在帖子中提到了一个。选择将是这样的:

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_type,而person_id只有user_idvisitor_id。两者都可以为空,你甚至可以在它们上放一个强大的外键。选择非常相似:

select * from
   cars a
   left join users u on (a.user_id=u.id)
   left join visitors v on (a.visitor_id=v.id)

最后但并非最不重要的,也许您可​​以将usersvisitors表合并到一个表中?

[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)