Mysql 使用外键连接3个表,并从同一个表返回两个单独的字段

Mysql 使用外键连接3个表,并从同一个表返回两个单独的字段,mysql,join,key,Mysql,Join,Key,我有三张这样的桌子: People: +------------+-------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+-------------------+------------

我有三张这样的桌子:

People:
+------------+-------------+------+-----+-------------------+----------------+
| Field      | Type        | Null | Key | Default           | Extra          |
+------------+-------------+------+-----+-------------------+----------------+
| id         | int(11)     | NO   | PRI | NULL              | auto_increment |
| fname      | varchar(32) | NO   |     | NULL              |                |
| lname      | varchar(32) | NO   |     | NULL              |                |
| dob        | date        | NO   |     | 0000-00-00        |                |
| license_no | varchar(24) | NO   |     | NULL              |                |
| date_added | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| status     | varchar(8)  | NO   |     | Allow             |                |
+------------+-------------+------+-----+-------------------+----------------+

Units:
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| number   | varchar(3)  | NO   |     | NULL    |                |
| resident | int(11)     | NO   | MUL | NULL    |                |
| type     | varchar(16) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

Visits:
+----------+-----------+------+-----+---------------------+----------------+
| Field    | Type      | Null | Key | Default             | Extra          |
+----------+-----------+------+-----+---------------------+----------------+
| id       | int(11)   | NO   | PRI | NULL                | auto_increment |
| vis_id   | int(11)   | NO   | MUL | NULL                |                |
| unit     | int(11)   | NO   | MUL | NULL                |                |
| time_in  | timestamp | NO   |     | CURRENT_TIMESTAMP   |                |
| time_out | timestamp | NO   |     | 0000-00-00 00:00:00 |                |
+----------+-----------+------+-----+---------------------+----------------+
有多个外键链接这些表:

units.resident -> people.id

visits.unit    -> units.id

visits.vis_id  -> people.id
基本上,我曾试图简化我的设计,并将“居民”和“访客”放在一个表中,但现在我无法用查询将它们“链接”在一起。。。以下是我希望能够从查询中返回的内容:

concat(p.lname, ', ', p.fname)
u.number
concat(p.lname, ', ', p.fname)
time_in
time_out
第一组名字应该来自居民,我们知道他是居民,因为他们被
units
中的外键引用。
u.number
将返回该住户的单元号,第二组姓名将是他们当前的访客(尚未签出的访客,由
0000-00-00
时间戳确定……如果他们签出,则不会是
0000-00-00
,因此不会显示)

我开始觉得这对像我这样的新手来说太难了,我自己弄不清楚,或者我的DB设计有缺陷。。。我希望所有居民和访客都在同一个表中的原因是,我希望他们都可以使用
全文
索引进行搜索


如果你有什么建议,我洗耳恭听,因为我已经为这件事把头撞在墙上好几天了……

像这样的事情怎么样

SELECT  concat(p.lname, ', ', p.fname)
        u.number
        concat(pv.lname, ', ', pv.fname)
        v.time_in
        v.time_out
FROm    units u LEFT JOIN
        people p    ON  u.resident = p.id LEFT JOIN
        visits v    ON  u.id = v.unit LEFT JOIN
        people pv   ON  v.vis_id = pv.id

关于连接的基本介绍,请看一下

另外,如果您不介意的话,您能告诉我为什么要使用左连接吗?我是个新手,所以我真的不明白为什么我需要使用它们而不是内部连接…我会检查一下,谢谢你的帮助。我会给你投票,但我没有足够的代表权!