1

次のような 3 つのテーブルがあります。

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居住者のユニット番号を返し、名前の 2 番目のセットは現在の訪問者 (まだチェックアウトしていない0000-00-00人で、タイムスタンプによって決定されます... チェックアウトした場合、そうではないため、そうで0000-00-00はありません)表示されます)。

これは、私のような初心者が自分で理解するには難しすぎるか、DB 設計に欠陥があるのではないかと考え始めています...すべての居住者と訪問者を同じテーブルに入れたかった理由は、インデックスを使用してそれらすべてを検索できるようにしたいと考えています。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 に答える