【问题标题】:Join 3 tables using foreign keys, with two separate fields returned from the same table使用外键连接 3 个表,从同一个表返回两个单独的字段
【发布时间】:2013-08-15 06:54:30
【问题描述】:

我有三个如下所示的表:

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,因此不会显示)。

我开始认为这对于像我这样的新手来说很难自己弄清楚,或者我的数据库设计有缺陷......我希望所有居民和访客都在同一张桌子上的原因是我希望它们 all 可以使用 fulltext 索引进行搜索。

如果您有任何建议,我会全力以赴,因为这几天我一直在用头撞墙......

【问题讨论】:

    标签: mysql join key


    【解决方案1】:

    怎么样

    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
    

    有关连接的基本介绍,请查看Introduction to JOINs – Basic of JOINs

    【讨论】:

    • 另外,如果你不介意,你能告诉我为什么我会使用左连接吗?我很新,所以我真的不明白为什么我需要使用它们而不是内部连接......
    • 我会检查一下,感谢您的帮助。我会给你一票,但我没有足够的代表!
    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多