gpt4 book ai didi

MySQL根据第三个外键从2个表中加入数据,没有重复或分组依据

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:29 25 4
gpt4 key购买 nike

我有三个表,如下所示:

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

我能够运行此查询来查找所有 residents 即 - 来自 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;

这适用于除 一个 居民以外的所有人,他的 u.number 显示在所有结果中。居民很快就会有 license_no 条目,而我不能一直在返回的结果中有那个奇怪的条目,所以这个查询不会作为一个长期的解决方案。

如何 group by 来构造查询以返回我想要的结果?

最佳答案

这应该可行

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

额外提示。

table 上的人应该叫人。u.resident 是指一个人。所以它应该是单元表中的 person_id...

如果您的命名约定易于使用,更好的逻辑有助于更好地编写 SQL。

关于MySQL根据第三个外键从2个表中加入数据,没有重复或分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com