如何在MySQL中查找符合指定面积范围的地块组合?
MySQL递归查询筛选符合总面积范围的地块组合
要实现筛选总面积符合指定范围的地块组合,可以借助MySQL的递归CTE(公共表表达式)生成所有可能的非空地块组合,同时计算每个组合的总面积,最后过滤出符合条件的结果。以下是具体实现方案:
核心思路
通过递归CTE生成所有无重复、元素唯一且ID递增的地块组合(避免生成顺序不同但元素相同的重复组合,比如[1,2]和[2,1]视为同一组合),同时累计每个组合的总面积,最终筛选出总面积落在目标区间内的组合。
完整SQL实现
WITH RECURSIVE lot_combinations AS ( -- 锚点成员:单个地块作为初始组合 SELECT id AS max_id, CAST(id AS CHAR(255)) AS lot_ids, surface_dispo AS total_surface FROM lot UNION ALL -- 递归成员:将现有组合与ID更大的地块拼接,生成新组合 SELECT l.id AS max_id, CONCAT(lc.lot_ids, ',', l.id) AS lot_ids, lc.total_surface + l.surface_dispo AS total_surface FROM lot_combinations lc JOIN lot l ON l.id > lc.max_id ) -- 筛选符合目标总面积范围的组合 SELECT lot_ids AS 地块组合ID, total_surface AS 总面积 FROM lot_combinations WHERE total_surface BETWEEN 1500 AND 2000 -- 替换为目标范围 ORDER BY total_surface;
针对不同范围的测试
1. 目标范围1500-2000平方米
将WHERE子句改为total_surface BETWEEN 1500 AND 2000,执行后结果:
地块组合ID | 总面积 ----------|------- 2,3 | 1550
2. 目标范围2000-2500平方米
将WHERE子句改为total_surface BETWEEN 2000 AND 2500,执行后结果:
地块组合ID | 总面积 ----------|------- 1,2,3 | 2100
关键细节说明
- 避免重复组合:通过
l.id > lc.max_id确保每次拼接的地块ID都大于当前组合的最大ID,仅生成ID递增的组合,不会出现元素相同但顺序不同的重复结果,减少无效计算。 - 数据类型处理:将
id转为CHAR类型拼接组合ID列表,保证字符串拼接正常;总面积直接累加surface_dispo数值即可。 - 递归终止条件:当没有更大ID的地块可以拼接时,递归自动终止。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

