SQL选择按顺序编号的行

时间:2018-06-24 17:23:27

标签: mysql sql

我有一个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中可能吗?谢谢

2 个答案:

答案 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) |

参见演示http://sqlfiddle.com/#!9/c5dfce/39

答案 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;