0

次のような 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

このクエリを実行して、すべての居住者、つまり、外部キーによって参照されているすべての居住者を見つけることができます。peopleunits.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

それは私が望む結果を返します...しかし、居住者ではないすべての人、つまり外部キーによって参照されていないすべての人を見つけるには、これの反対を行うと便利です。peopleunits.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ですか?

4

2 に答える 2

2

これはうまくいくはずです

SELECT 
 p.id
 , P.fname
 , P.lname
FROM
 people AS p
LEFT JOIN
 units AS u
ON
 p.id = u.resident 
WHERE
 u.resident IS NULL

余分なヒント。

テーブルの人々は人と呼ばれるべきです。居住者とは、人を意味します。したがって、ユニットテーブルにある person_id である必要があります...

命名規則が明確に使用できる場合、より良いロジックは SQL をより適切に記述するのに役立ちます。

于 2013-08-15T19:28:25.010 に答える
1

NOT EXISTS 句を使用して、居住者を除外します。

SELECT  P.id
        ,P.fname
        ,P.lname
        ,etc...
FROM    People P
WHERE NOT EXISTS (SELECT 1 FROM Units U WHERE U.resident = P.id)
于 2013-08-15T19:14:32.827 に答える