MySQL家族表SQL查询求助:修正获取Fay姑姑、Hana男性堂兄的语句
基础SQL查询修正:家族表关联问题
表结构说明
使用的家族表结构如下,其中parent_id关联同表的id字段:
| id | name | gender | parent_id |
|---|---|---|---|
| 1 | Adam | 男 | NULL |
| 2 | Alvin | 男 | 1 |
| 3 | Chris | 男 | 1 |
| 4 | Michael | 男 | 1 |
| 5 | Lala | 女 | 1 |
| 6 | Matt | 男 | 2 |
| 7 | Fay | 女 | 2 |
| 8 | Percy | 男 | 3 |
| 9 | Jackson | 男 | 3 |
| 10 | Hana | 女 | 4 |
| 11 | Hani | 女 | 4 |
任务1:获取Fay的姑姑
错误代码
SELECT aunt.* FROM family AS aunt JOIN family AS parent ON aunt.parent_id = parent.id JOIN family AS cousin ON parent.id = cousin.parent_id WHERE cousin.id = 7 AND aunt.gender = 'female';
问题分析
原逻辑错误:当前关联会查找与Fay同父母的女性(即Fay的姐妹),但Fay没有姐妹,且完全没关联到Fay的父系长辈,无法定位到姑姑(父亲的姐妹)。
修正后代码
SELECT aunt.* FROM family AS fay JOIN family AS fay_parent ON fay.parent_id = fay_parent.id JOIN family AS aunt ON aunt.parent_id = fay_parent.parent_id WHERE fay.id = 7 AND aunt.gender = 'female' AND aunt.id != fay_parent.id;
逻辑说明
- 先定位Fay的记录;
- 关联找到Fay的父亲(
fay_parent); - 找到与Fay父亲同父母的女性,排除父亲本人(虽父亲为男性,此判断可省略,但更严谨),即为Fay的姑姑(Lala)。
任务2:获取Hana的男性堂兄
错误代码
SELECT male_cousin.* FROM family AS cousin JOIN family AS parent ON cousin.parent_id = parent.id JOIN family AS grandparent ON parent.parent_id = grandparent.id JOIN family AS male_cousin ON grandparent.id = male_cousin.parent_id WHERE cousin.id = 10 AND male_cousin.gender = 'male';
问题分析
原逻辑错误:直接将male_cousin的父级关联到祖父,得到的是Hana的叔叔(父亲的兄弟),而非堂兄(叔叔的儿子)。
修正后代码
SELECT male_cousin.* FROM family AS hana JOIN family AS hana_parent ON hana.parent_id = hana_parent.id JOIN family AS uncle ON uncle.parent_id = hana_parent.parent_id AND uncle.gender = 'male' AND uncle.id != hana_parent.id JOIN family AS male_cousin ON male_cousin.parent_id = uncle.id AND male_cousin.gender = 'male' WHERE hana.id = 10;
逻辑说明
- 定位Hana的记录;
- 关联找到Hana的父亲(
hana_parent); - 找到Hana父亲的兄弟(同父母、男性、排除父亲本人),即叔叔;
- 关联找到这些叔叔的儿子,且为男性,即为Hana的男性堂兄(Matt、Percy、Jackson)。
内容的提问来源于stack exchange,提问作者user19591044
相关产品推荐
相关产品推荐

