Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / java code --> sql procedure/function / 25 сообщений из 45, страница 1 из 2
17.12.2014, 15:18:27
    #38836088
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Добрый день.

Структура таблицы:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    -- Структура таблицы `product`
     
    CREATE TABLE IF NOT EXISTS `product` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `code` int(11) NOT NULL,
    `type_tool` tinyint(1) NOT NULL,
    `code_tool` int(11) NOT NULL,
    `size_tool` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
     
    -- Структура таблицы `tool`
     
    CREATE TABLE IF NOT EXISTS `tool` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` text NOT NULL,
    `size` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;







Поле type_tool принимает 0 или 1 (запчасть из tool / продукт из product).
Поле code_tool код запчасти / продукта.
Поле size_tool количество.

Достаточно ли запчастей для сборки самолета ? т.е. необходимо обойти дерево.



Имею такой код на java, пытаюсь сделать то же самое на sql.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
    public boolean has(int itemId) throws SQLException {
            final Queue<CompoundItemRequest> itemsToCheck = new LinkedList<>();
            itemsToCheck.add(new CompoundItemRequest(itemId, 1));

            Connection conn = DriverManager.getConnection(url, properties);
            PreparedStatement insufficientDetails = conn.prepareStatement(
                    "select 1 from product join tool "
                    + " on product.type_tool = 0 and product.code_tool = tool.id "
                    + " where product.code = ? and product.type_tool = 0 and product.size_tool * ? > tool.size");
            PreparedStatement compoundDetails = conn.prepareStatement(
                    "select code_tool, size_tool from product "
                    + " where code = ? and type_tool = 1");
   
                compoundDetails.setInt(1, itemId);  
                try (ResultSet rs = compoundDetails.executeQuery()) {
                        while (rs.next())
                            itemsToCheck.add(new CompoundItemRequest(rs.getInt("code_tool"), rs.getInt("size_tool") * 1));
                  }
                while(!itemsToCheck.isEmpty()){
                    final CompoundItemRequest item = itemsToCheck.remove();

                    insufficientDetails.setInt(1, item.itemId);
                    insufficientDetails.setInt(2, item.numberOfItems);
                    try (ResultSet rs = insufficientDetails.executeQuery()) {
                        if (rs.next())return false;
                        
                    }
                }     
                
            
            return true;
        }

Возможно ли сделать рекурсивно/нерекурсивно  ?
...
Рейтинг: 0 / 0
17.12.2014, 15:30:57
    #38836101
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
В MySQL нет рекурсии. Посему придётся разворачивать дерево из таблицы product в рамках, например, хранимой процедуры, накапливая итоги во временной таблице. После завершения к ней привязываете к полученной таблице таблицу tool и получаете конечный результат.
...
Рейтинг: 0 / 0
17.12.2014, 15:53:20
    #38836131
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Благодарю, результаты выложу.
...
Рейтинг: 0 / 0
17.12.2014, 19:26:27
    #38836367
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Что то подобное, но необходимо переделать на с sql-е курсоры и циклы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;
DROP TEMPORARY TABLE IF EXISTS `e`;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*с всегда содержит единственную запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В е хранятся подузлы каждого узла,чтоб добавить их в b */
CREATE TEMPORARY TABLE `e` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);


b =  INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);


   while(b != null){

    c = select min(`code`),`size_tool` from b group by `id`;
    "delet from `b` where `code` = min(`code`) group by `id`;"

    d = select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;
    if(d != 0)return 0;

e = select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;

 while(e != null)b+=e.next();

}
...
Рейтинг: 0 / 0
17.12.2014, 19:34:50
    #38836378
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Изменения.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;


/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(b != null){

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b group by `id`;"
    "delet from `b` where `code` = min(`code`) group by `id`;"

    "insert into d (`code`) select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;"
    if(d != 0)return 0;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}
...
Рейтинг: 0 / 0
18.12.2014, 09:08:20
    #38836629
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Изменения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;


/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(b != null){

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b group by `code`;"

    "delet from `b` order by `code` limit 1;

    "insert into d (`code`) select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;"
    if(d != 0)return 0;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}
...
Рейтинг: 0 / 0
18.12.2014, 09:21:08
    #38836639
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Изменения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;
DROP TEMPORARY TABLE IF EXISTS `d`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*В d хранятся результаты запроса с использованием данных из с */
CREATE TEMPORARY TABLE `d` (`code` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
     SET @tmpb := (SELECT COUNT(*) FROM `b`);
     SELECT @tmpb;

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b group by `code`;"

    "delet from `b` order by `code` limit 1;

    "insert into d (`code`) select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;"
     
     SET @tmpd := (SELECT COUNT(*) FROM `d`);
     SELECT @tmpd;

    if(tmpd != 0)return false;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}

return true;
...
Рейтинг: 0 / 0
18.12.2014, 09:36:04
    #38836650
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Но данный код не рабочий.
...
Рейтинг: 0 / 0
18.12.2014, 12:03:45
    #38836827
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Ну надо как минимум приводить копию кода, а не вольные раасуждения на тему. Что там за кавычки лишние?
Что вообще за логика реализуется кодом - я, например, в этой каше разобраться не могу...
...
Рейтинг: 0 / 0
18.12.2014, 12:09:12
    #38836833
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Копию кода я приложил. это и есть внутренность процедуры которую я хочу написать.
...
Рейтинг: 0 / 0
18.12.2014, 12:10:30
    #38836834
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
т.е. я попробовал реализовать тот же алгоритм что и на ява в 1-ом посте.
...
Рейтинг: 0 / 0
18.12.2014, 12:25:29
    #38836858
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
scofielcl
Код: plsql
1.
select min(`code`),`size_tool` from b group by `code`

шта?
...
Рейтинг: 0 / 0
18.12.2014, 12:33:24
    #38836865
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
AkinaЧто вообще за логика реализуется кодомятакду, получить состав изделия, т.е. найти всех потомков определённой записи (потомков записи с заданным кодом и type_tool=1)
scofielcl, сюда загляните 13675569
...
Рейтинг: 0 / 0
18.12.2014, 12:37:42
    #38836874
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
tanglir , я тожтакду... но реализация...
...
Рейтинг: 0 / 0
18.12.2014, 12:38:36
    #38836879
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
tanglirscofielcl
Код: plsql
1.
select min(`code`),`size_tool` from b group by `code`

шта?

грубый набросок, не имеющий ничего общего с действительностью.
...
Рейтинг: 0 / 0
18.12.2014, 12:49:15
    #38836892
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
почему вы считаете данный кусок кода логически неверным.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
     SET @tmpb := (SELECT COUNT(*) FROM `b`);
     SELECT @tmpb;

    "insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b order by `code`;"

    "delet from `b` order by `code` limit 1;

    SET @tmpd := select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;
     
    if(tmpd != 0)return false;

    "insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;"

}

return true;
...
Рейтинг: 0 / 0
18.12.2014, 13:01:27
    #38836915
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Забаная подсветка - ажно шесть строк красным - не наталкивает ни на какие мысли, да?
...
Рейтинг: 0 / 0
18.12.2014, 13:03:29
    #38836920
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
ну синтаксис и логика довольно разные понятие, на верность синтаксиса я и не расчитываю.
...
Рейтинг: 0 / 0
18.12.2014, 13:05:11
    #38836923
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Пока синтаксис неверен - логику проверить невозможно. Да и бессмысленно - всё равно код будет изменён.
...
Рейтинг: 0 / 0
18.12.2014, 13:10:32
    #38836932
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
я конечно уберу красное, но суть останеться прежней
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
DROP TEMPORARY TABLE IF EXISTS `b`;
DROP TEMPORARY TABLE IF EXISTS `c`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);
/*в с всегда будет только одна запись*/
CREATE TEMPORARY TABLE `c` (`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
     SET @tmpb := (SELECT COUNT(*) FROM `b`);
     SELECT @tmpb;

    insert into c (`code`, `size_tool`) select min(`code`),`size_tool` from b order by `code`;

    delet from `b` order by `code` limit 1;

    SET @tmpd := select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = c.code and product.type_tool = 0 and product.size_tool * c.size_tool > too.size;
     
    if(tmpd != 0)return false;

    insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = c.code and type_tool = 1;

}

return true;
...
Рейтинг: 0 / 0
18.12.2014, 13:16:01
    #38836942
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
DROP TEMPORARY TABLE IF EXISTS `b`;

DECLARE @tmpb,@tmpd INT DEFAULT 1;
DECLARE @code,@size_tool INT DEFAULT 1;

/*В b храним все узлы дерева , т.е. все записи где type_tool = 1 */
CREATE TEMPORARY TABLE `b` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` int(11) NOT NULL,`size_tool` int(11) NOT NULL);

 INSERT INTO `b` (id,code,size_tool) VALUE (0,id_search,1);

   while(tmpb != 0){
     
    SET @tmpb := (SELECT COUNT(*) FROM `b`);

    SET @code := select `code` from b order by `code` limit 1;
    SET @size_tool := select `size_tool` from b order by `code` limit 1;

    Delet from `b` order by `code` limit 1;

    SET @tmpd := select 1 from product join tool on product.type_tool = 0 and product.code_tool = tool.id where product.code = @code and product.type_tool = 0 and product.size_tool * @size_tool > tool.size;
     
    if(tmpd != 0)return false;

    Insert into b (`id`,`code_tool`,`size_tool`)select `id`, `code_tool`,`size_tool` from product where `code` = @code and type_tool = 1;

}

return true;
...
Рейтинг: 0 / 0
18.12.2014, 13:33:01
    #38836970
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
scofielcl,
максимальная глубина дерева ограничена ?
...
Рейтинг: 0 / 0
18.12.2014, 14:13:51
    #38837032
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Это вообще на каком языке написано? фигурные скобки и прочие неизвестные серверу MySQL конструкции...
...
Рейтинг: 0 / 0
18.12.2014, 14:19:23
    #38837042
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
А алгоритм можно сделать таким.

Создаём таблицу для накопления запчастей. Поле ID объявляем уникальным (можно первичным ключом).
Кладём с неё начальную запись.
Организуем цикл.
Получаем и сохраняем в переменной количество записей таблицы.
Вставляем в таблицу записи из исходных данных, связав их соотв. образом с временной и игнорируя дубликаты.
Снова сохраняем в переменной количество записей таблицы.
Продолжаем цикл, пока количества не совпадают. Количество циклюв получится на 1 больше макс. уровня вложенности.
Теперь осталось связать таблицу со второй исходной и вывести результат.
...
Рейтинг: 0 / 0
18.12.2014, 14:31:12
    #38837067
scofielcl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java code --> sql procedure/function
Сейчас буду пробовать. Глубина ограничена.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / java code --> sql procedure/function / 25 сообщений из 45, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]