我有一个1:N表,其中每个实体可能都有一个分配的多个数字。
ID Number
1 10
1 13
1 11
1 12
1 16
2 11
2 12
2 13
2 10
现在,我想要所有具有3个数字升序排列的ID。我没有指定我想要的数字,我只是想让SQL返回它可以找到的所有可能的组合,但是数字必须按升序排列,并且该序列必须正好包含3个数字。这些数字始终是任何值的整数。结果中的数字必须相邻(12、13、16)为无效结果。
在此示例中,对于3个数字为:
ID 1:(10,11,12),(11,12,13)
ID 2:(11,12,13),(10,11,13)
在此示例中,对于2个数字为:
ID 1:(10,11),(11,12),(12,13)
ID 2:(11,12)(12,13)
这在SQL select中可能吗?谢谢
答案 0 :(得分:1)
解决方案接近您的预期输出。
涉及将自身内部联接与CONCAT_WS,GROUP_CONCAT结合使用。
对于三人一组,请使用此查询
查询
SELECT
records.ID
, GROUP_CONCAT(CONCAT('(', records.number, ')'))
FROM (
SELECT
DISTINCT
table11.ID
, CONCAT_WS(
','
, table11.Number
, table12.Number
, table13.Number
) AS number
FROM
Table1 AS table11
INNER JOIN
Table1 AS table12
ON
table11.Number + 1 = table12.Number
INNER JOIN
Table1 table13
ON
table12.Number + 1 = table13.Number
ORDER BY
table11.ID ASC
, table11.Number ASC
) AS records
GROUP BY
records.ID
结果
| ID | GROUP_CONCAT(CONCAT('(', records.number, ')')) |
|----|------------------------------------------------|
| 1 | (11,12,13),(10,11,12) |
| 2 | (11,12,13),(10,11,12) |
答案 1 :(得分:1)
只需使用join
。这将产生一个结果集,其中每个示例的序号都在不同的行上:
select id, t1.number, t2.number, t3.number
from t t1 join
t t2
on t2.id = t1.id and t2.number = t1.number + 1 join
t t3
on t3.id = t2.id and t3.number = t2.number + 1;
如果您真的想要一个列表,只需执行以下操作:
select id,
group_concat('(', t1.number, ',', t2.number, ',', t3.number, ')') as groups
from t t1 join
t t2
on t2.id = t1.id and t2.number = t1.number + 1 join
t t3
on t3.id = t2.id and t3.number = t2.number + 1
group by t1.id;