我有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
答案 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_id
和visitor_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)
最后但并非最不重要的,也许您可以将users
和visitors
表合并到一个表中?
[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)