1

我有三个看起来像这样的表:

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

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

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

4

1 回答 1

2

像这样的东西怎么样

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

有关连接的基本介绍,请查看JOIN 简介 – JOIN 基础

于 2013-08-15T07:00:46.370 回答