假设我们有一个名为SMALLER
的表,列num_1
和num_2
,都是整数类型,还有一些数据。
看起来像这样:
`num_1` `num_2`
1 2
2 3
2 8
3 4
4 5
.
.
. Much much much more
.
我想要做的是扩展此表,然后收集所有“更小”的关系。 这样,结果表应如下所示:
`num_1` `num_2`
1 2
1 3
1 4
1 5
1 8
2 3
2 4
2 5
2 8
3 4
3 5
4 5
我感谢所有的帮助!
此外,如果不是“较小”的关系,该表只有一个“连接”关系,例如,'1'连接到'2','2'连接到'3','2'连接到'4',这样我们就说1-2,1-3,1-4,2-3,2-4。
答案 0 :(得分:0)
一个好的起点是:
SELECT
A.num_1, B.num_2
FROM
Smaller AS A JOIN Smaller AS B ON (A.num_1 < B.num_2)
ORDER BY A.num_1, B.num_2;
在存储过程中,将其放入游标中,遍历游标,并为每行执行INSERT IGNORE。即:
DECLARE num1,num2 INT;
DECLARE done DEFAULT 0;
DECLARE mycursor CURSOR FOR SELECT # use the select above, im lazy here
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN mycursor;
my_loop: LOOP
FETCH mycursor INTO num1, num2;
IF done THEN
LEAVE my_loop;
END IF;
INSERT IGNORE INTO Smaller VALUES (num1,num2);
END LOOP;
要回答您更新的问题,虽然不完全确定您是否通过唯一行之间的关系来表示连接(您需要两列来存储此关系,因此它将非常相似)。或者,如果您的意思是您有一个包含所有数字的表,另一个包含第一个表的行之间的关系的两个列表。
或者,最后,如果你想要一个只包含“1-2”,“1-3”等字符串的表。如果是这样的话,我会将它保存为两个单独的列,并使用CONCAT将它们输出为字符串当你轮询桌子时:)