MySQL存储过程设计问题。诵读或层次结构?

时间:2011-07-06 20:18:21

标签: mysql stored-procedures recursion hierarchy

假设我们有一个名为SMALLER的表,列num_1num_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。

1 个答案:

答案 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将它们输出为字符串当你轮询桌子时:)

相关问题