You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:28:19