次のような 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
このクエリを実行して、すべての居住者、つまり、外部キーによって参照されているすべての居住者を見つけることができます。people
units.resident
SELECT concat(p.lname, ', ', p.fname) as 'Resident', p.dob as 'Birthday',
u.number as 'Unit #'
from people p, units u
where p.id = u.resident
order by u.number
それは私が望む結果を返します...しかし、居住者ではないすべての人、つまり外部キーによって参照されていないすべての人を見つけるには、これの反対を行うと便利です。people
units.resident
私はさまざまなクエリを試しましたが、特にいくつかの内部結合と左結合を試しましたが、重複するエントリが多すぎます (ここで読んだことから、これは正常です)。group by license_no
現在のところ、「居住者」には次のような情報がないため、機能することがわかったのは を使用することだけです。
SELECT p.id, concat(p.lname, ', ', p.fname) as 'Visitor',
p.license_no as 'License', u.number from people p
left join units u on u.number <> p.id
group by p.license_no order by p.id;
これは、すべての結果に表示される1 人の居住者を除くすべての居住者に有効です。u.number
居住者はすぐにlicense_no
エントリを取得しますが、返される結果にその奇妙なエントリが常に含まれているわけではないため、このクエリは長期的な解決策としては機能しません。
を使用せずに、必要な結果を返すクエリを構成するにはどうすればよいgroup by
ですか?