背景: 在正规的宠物繁育体系中,记录宠物的血统和族谱至关重要,这不仅是为了证明其品种的纯正,更重要的是为了排查和预防遗传性疾病。现有一家大型宠物繁育协会,记录了注册宠物猫的基本信息以及它们的繁育后代记录。近期发现一只名为Luna的母猫携带了某种隐性遗传病基因。为了通知相关的饲主进行健康检查,协会需要追溯Luna的所有直系后代(包括子女、孙辈、曾孙辈等)。 表结构和字段说明: 表名:cats(宠物猫信息表) cat_id:整数类型,宠物猫的唯一注册编号,主键 cat_name:字符串类型,宠物猫的呼名(名字) breed:字符串类型,宠物猫的品种(如缅因猫、布偶猫等) 表名:breeding_records(繁育记录表) parent_cat_id:整数类型,父母猫的注册编号(即繁育者) child_cat_id:整数类型,子代猫的注册编号(即后代) birth_date:日期类型,子代猫的出生日期 health_score:浮点数类型,子代猫出生时的健康评分(满分100) 3.问题 请编写一条 MySQL 查询语句,查出由名为'Luna'的宠物猫繁育出的所有直接和间接后代。 查询条件限制: 仅统计出生日期(birth_date)在 2025年1月1日至2025年12月31日期间的后代(注意:如果中间某一代的出生日期不在2025年,也会导致该分支的追溯中断,实际查询中需确保递归链路上的繁育记录满足日期要求)。 在结果中,需要计算出每一只后代猫的“综合健康评估指数”(composite_index),计算公式为:基础健康评分(health_score) * (0.95 ^ 世代代数)。其中直接子女的世代代数为1,孙辈为2,以此类推。该指数需四舍五入保留2位小数。 返回字段要求: descendant_id:后代猫的注册编号 descendant_name:后代猫的呼名 generation:世代代数(子女为1,孙辈为2,依此类推) composite_index:综合健康评估指数(四舍五入保留2位小数) 排序规则: 结果须首先按世代代数(generation)进行升序排列;若世代代数相同,则按综合健康评估指数(composite_index)进行降序排列;若综合健康评估指数也相同,则按后代猫的注册编号(descendant_id)进行升序排列。
示例1
输入
-- 创建表结构
DROP TABLE IF EXISTS breeding_records;
DROP TABLE IF EXISTS cats;
CREATE TABLE cats (
cat_id INT PRIMARY KEY,
cat_name VARCHAR(100),
breed VARCHAR(50)
);
CREATE TABLE breeding_records (
parent_cat_id INT,
child_cat_id INT,
birth_date DATE,
health_score DECIMAL(5, 2)
);
-- 插入示例数据
INSERT INTO cats (cat_id, cat_name, breed) VALUES
(100, 'Luna', 'Ragdoll'),
(101, 'Milo', 'Ragdoll'),
(102, 'Bella', 'Ragdoll'),
(103, 'Leo', 'Ragdoll'),
(104, 'Chloe', 'Ragdoll'),
(105, 'Simba', 'Ragdoll'),
(106, 'Nala', 'Ragdoll');
INSERT INTO breeding_records (parent_cat_id, child_cat_id, birth_date, health_score) VALUES
(100, 101, '2025-02-15', 90.00), -- Luna的子女,世代1
(100, 102, '2025-03-20', 95.00), -- Luna的子女,世代1
(101, 103, '2025-10-10', 88.00), -- Milo的子女 (Luna的孙辈),世代2
(101, 104, '2025-11-05', 88.00), -- Milo的子女 (Luna的孙辈),世代2,健康评分相同
(102, 105, '2025-12-01', 92.00), -- Bella的子女 (Luna的孙辈),世代2
(105, 106, '2024-12-25', 96.00); -- Simba的子女,但出生在2024年,不应计入结果
输出
descendant_id|descendant_name|generation|composite_index
102|Bella|1|90.25
101|Milo|1|85.5
105|Simba|2|83.03
103|Leo|2|79.42
104|Chloe|2|79.42
说明
(注意:Nala (106) 因出生在 2024 年未被统计;Leo (103) 和 Chloe (104) 计算出的综合指数相同,按 ID 升序排列。指数计算示例:Milo 世代1,90 * 0.95^1 = 85.50;Leo 世代2,88 * 0.95^2 = 79.42)
加载中...