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