Проблема проектирования хранимых процедур MySQL. Отречение или Иерархия? - PullRequest
1 голос
/ 07 июля 2011

Предположим, у нас есть таблица с именем 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.

1 Ответ

0 голосов
/ 07 июля 2011

Хорошее место для начала было бы:

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 при опросе таблицы:)

...