MYSQL -如何检查是否有一个可能的值组合适合某个范围

g6ll5ycj  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(89)

我试图运行一个算法,以包括/排除一些approximately取决于是否有一个平方米的总量,以适应一个标准。
下面是一组数据的例子:

CREATE TABLE lot
( `id` int(11), `surface_dispo` int(11));

INSERT INTO lot
    (`id`, `surface_dispo`)
VALUES
    ('1', '550'),
    ('2', '700'),
    ('3', '850');

假设我想找到1500到2000平方米之间的所有可能的组合。在该示例中,我应该能够检索批次N° 2和3的组合,但不能检索1 2和3
我读过一些关于MYSQL中递归函数的主题,但我无法转换我找到的例子,因为它们太具体了,关于字符串连接,而不是SUM。
还请注意,这些批次的SUM可能涉及N个数字,假设我想找到2000和2500之间的所有可用表面,我应该检索1 + 2 + 3。
提前感谢您的帮助,我将提供任何需要的进一步信息。

7hiiyaii

7hiiyaii1#

可能的解决方案(示例):

CREATE TABLE test (
  id INT AUTO_INCREMENT PRIMARY KEY,
  val INT
);
INSERT INTO test (val)
WITH RECURSIVE cte AS (
  SELECT 1 num UNION ALL SELECT num + 1 FROM cte LIMIT 10
)
SELECT 1000 * RAND() FROM cte;
SELECT * FROM test;

| ID|瓦尔|
| --|--|
| 1 | 745 |
| 2 | 992 |
| 3 | 726 |
| 4 | 651 |
| 5 | 80 |
| 6 | 445 |
| 7 | 985 |
| 8 | 590 |
| 9 | 995 |
| 10 | 203 |

SET @minimal := 2000;
set @maximal := 2100;
WITH RECURSIVE cte AS (
  SELECT id, val AS total, CAST(id AS CHAR(65535)) rowset FROM test
  UNION ALL
  SELECT test.id, cte.total + test.val, CONCAT_WS(',', cte.rowset, test.id)
  FROM cte
  JOIN test ON test.id > cte.id AND cte.total < @maximal
)
SELECT rowset, total
FROM cte
WHERE total BETWEEN @minimal AND @maximal;

| 行集|总|
| --|--|
| 一、三、八| 2061 |
| 二四六| 2088 |
| 二、五、七| 2057 |
| 二、五、九| 2067 |
| 二、六、八| 2027 |
| 四六七| 2081 |
| 四六九| 2091 |
| 五七九| 2060 |
| 六、七、八| 2020 |
| 六八九| 2030 |
| 一、二、五、十| 2020 |
| 一、四、五、八| 2066 |
| 一、四、六、十| 2044 |
| 一、五、七、十| 2013 |
| 一、五、九、十| 2023 |
| 二、三、五、十| 2001 |
| 三、四、五、八| 2047 |
| 三四六十| 2025 |
| 三五九十| 2004 |
| 五六七八| 2100 |
| 一、五、六、八、十| 2063 |
| 三五六八十| 2044 |
fiddle

相关问题