Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите перевести это на язык MYSQL / 12 сообщений из 12, страница 1 из 1
10.08.2015, 17:18:30
    #39026522
Помогите перевести это на язык MYSQL
Здравствуйте.

Прошу помочь перевести на язык MYSQL то, что я попытался оформить следующим псевдокодом:
Код: 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.
DELIMITER //
CREATE PROCEDURE needed_skus(@parent_category_id int(1))
BEGIN
	TRUNCATE TABLE bng347_product_ids;

	CREATE TABLE @temp_cat_id(virtuemart_category_id int(1));
	INSERT INTO @temp_cat_id(virtuemart_category_id) SELECT @parent_category_id as virtuemart_category_id;

	FOR EACH @category_id IN @temp_cat_id 
	BEGIN
		INSERT @temp_cat_id(virtuemart_category_id)
		SELECT child_category_id as virtuemart_category_id
		FROM ytgb1_virtuemart_category_categories
		WHERE 
			category_parent_id = @category_id;
	END

	INSERT bng347_product_ids(virtuemart_product_id)
	SELECT 
		DISTINCT
		virtuemart_product_id
	FROM ytgb1_virtuemart_product_categories pc
	JOIN @temp_cat_id USING(virtuemart_category_id)
END//
DELIMITER ;
...
Рейтинг: 0 / 0
10.08.2015, 17:48:37
    #39026537
Помогите перевести это на язык MYSQL
Немного продвинулся:
Код: 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.
CREATE PROCEDURE needed_ids(parent_category_id int(1))
LANGUAGE SQL
SQL SECURITY DEFINER
BEGIN
	TRUNCATE TABLE bng347_product_ids;
	DROP TEMPORARY TABLE IF EXISTS temp_cat_id;
	CREATE TEMPORARY TABLE temp_cat_id(virtuemart_category_id int(1));
	INSERT INTO temp_cat_id(virtuemart_category_id) SELECT parent_category_id as virtuemart_category_id;

	FOR EACH @category_id IN temp_cat_id
	BEGIN
		INSERT temp_cat_id(virtuemart_category_id)
		SELECT child_category_id as virtuemart_category_id
		FROM ytgb1_virtuemart_category_categories
		WHERE 
			category_parent_id = @category_id;
	END

	INSERT bng347_product_ids(virtuemart_product_id)
	SELECT 
		DISTINCT
		virtuemart_product_id
	FROM ytgb1_virtuemart_product_categories pc
	JOIN temp_cat_id USING(virtuemart_category_id)
END//


Сейчас ошибка указывает на FOR EACH @category_id IN temp_cat_id
Скажите, как в цикле можно перебирать каждое значение определённого столбца в таблице строка за строкой?
...
Рейтинг: 0 / 0
10.08.2015, 17:51:49
    #39026543
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести это на язык MYSQL
Какой-то корявый псевдокод...

Ты передаёшь в процедуру скалярное значение @parent_category_id. Затем кладёшь его в таблицу @temp_cat_id (получается ОДНА запись). Затем зачем-то организуешь переборную итерацию (For Each) по этому единственному значению - нафига?


Уж лучше словами объясни, чего надо сделать.
...
Рейтинг: 0 / 0
10.08.2015, 17:53:02
    #39026545
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести это на язык MYSQL
Борис Гаркункак в цикле можно перебирать каждое значение определённого столбца в таблице строка за строкой?Курсором... только вот зачем ПЕРЕБИРАТЬ? SQL позволяет обработать всё сразу.
...
Рейтинг: 0 / 0
10.08.2015, 20:16:56
    #39026622
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести это на язык MYSQL
Вообще, как я понимаю, ты хочешь организовать итерационный сбор всех то ли родителей, то ли потомков... так?
Присоединяю код - это я делал (уж не помню когда и зачем) пример реализации волнового алгоритма для MySQL. Задача хоть и другая, но суть та же - итерационное сгребание в кучку по матрице связности. Посмотри, вдруг поможет...
...
Рейтинг: 0 / 0
11.08.2015, 13:08:32
    #39026996
Помогите перевести это на язык MYSQL
Да, вы правильно поняли. Нужно вытащить все дочерние подкатегории указанной параметром категории. При этом дочерние подкатегории хранятся в таблице вида
CREATE TABLE `ytgb1_virtuemart_category_categories` (
`id` int(1) unsigned NOT NULL AUTO_INCREMENT,
`category_parent_id` int(1) unsigned NOT NULL DEFAULT '0',
`category_child_id` int(1) unsigned NOT NULL DEFAULT '0',
`ordering` int(1) NOT NULL DEFAULT '0',
)
Это самая пока сложная для меня задача - пройтись по таблице до самой последней подкатегории, какого бы уровня вложенности она не была

Спасибо. Буду изучать Ваш пример
...
Рейтинг: 0 / 0
11.08.2015, 13:13:43
    #39027003
Помогите перевести это на язык MYSQL
то есть задача составить список всех дочерних подкатегорий указанной категории
...
Рейтинг: 0 / 0
11.08.2015, 13:37:06
    #39027014
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести это на язык MYSQL
Борис Гаркунсоставить список всех дочерних подкатегорий указанной категории 13675569
...
Рейтинг: 0 / 0
11.08.2015, 14:14:00
    #39027039
Помогите перевести это на язык MYSQL
Спасибо.
Пока получается вот такое:
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
DELIMITER //

CREATE PROCEDURE needed_ids(parent_category_id int(1))
LANGUAGE SQL
SQL SECURITY DEFINER
BEGIN
	TRUNCATE TABLE bng347_product_ids;

	DROP TEMPORARY TABLE IF EXISTS sought_cats;
	CREATE TEMPORARY TABLE sought_cats(id int(1) unsigned NOT NULL AUTO_INCREMENT, virtuemart_category_id int(1));
	INSERT INTO sought_cats(virtuemart_category_id) SELECT parent_category_id as virtuemart_category_id;

	DROP TEMPORARY TABLE IF EXISTS allcats;
	CREATE TEMPORARY TABLE allcats(virtuemart_category_id int(1));
	INSERT INTO allcats(virtuemart_category_id) SELECT parent_category_id as virtuemart_category_id;
	
	DECLARE is_there_anybody INT DEFAULT 1;
	DECLARE last_row INT;
	
	WHILE is_there_anybody > 0	DO
		SET last_row = (SELECT MAX(id) FROM sought_cats);

		INSERT allcats(virtuemart_category_id)
		SELECT child_category_id as virtuemart_category_id
		FROM ytgb1_virtuemart_category_categories cc
		JOIN sought_cats sc ON sc.virtuemart_category_id = cc.category_parent_id
		
		INSERT sought_cats(virtuemart_category_id)
		SELECT child_category_id as virtuemart_category_id
		FROM ytgb1_virtuemart_category_categories cc
		JOIN sought_cats sc ON sc.virtuemart_category_id = cc.category_parent_id

		DELETE FROM sought_cats WHERE id <= last_row;
		
		SET is_there_anybody = SELECT COUNT(*) FROM sought_cats
		
	END WHILE;

	INSERT bng347_product_ids(virtuemart_product_id)
	SELECT 
		DISTINCT
		virtuemart_product_id
	FROM ytgb1_virtuemart_product_categories pc
	JOIN allcats USING(virtuemart_category_id)
END//
DELIMITER ;
...
Рейтинг: 0 / 0
11.08.2015, 14:15:11
    #39027041
Помогите перевести это на язык MYSQL
только почему-то возникает ошибка:
автор#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE is_there_anybody INT DEFAULT 1; DECLARE last_row INT; WHILE is_there' at line 15
...
Рейтинг: 0 / 0
11.08.2015, 15:42:13
    #39027138
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести это на язык MYSQL
Борис Гаркун,

Все DECLARE должны быть первыми в блоке BEGIN ... END.
...
Рейтинг: 0 / 0
11.08.2015, 17:20:01
    #39027264
Помогите перевести это на язык MYSQL
Всех благодарю.

Получилось в итоге так:
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
DROP PROCEDURE IF EXISTS needed_ids;
DELIMITER //

CREATE PROCEDURE needed_ids(parent_category_id int(1))
LANGUAGE SQL
SQL SECURITY DEFINER
BEGIN
	DECLARE is_there_anybody INT DEFAULT 1;
	DECLARE last_row INT;

	TRUNCATE TABLE bng347_product_ids;

	DROP TEMPORARY TABLE IF EXISTS sought_cats;
	CREATE TEMPORARY TABLE sought_cats(
		id int(1) unsigned NOT NULL AUTO_INCREMENT, 
		virtuemart_category_id int(1),
		PRIMARY KEY (`id`));
	INSERT INTO sought_cats(virtuemart_category_id) SELECT parent_category_id as virtuemart_category_id;

	DROP TEMPORARY TABLE IF EXISTS allcats;
	CREATE TEMPORARY TABLE allcats(
		id int(1) unsigned NOT NULL AUTO_INCREMENT, 
		virtuemart_category_id int(1),
		PRIMARY KEY (`id`));
	INSERT INTO allcats(virtuemart_category_id) SELECT parent_category_id as virtuemart_category_id;

	WHILE is_there_anybody > 0	DO
		/*SET last_row = (SELECT MAX(id) FROM sought_cats sc);*/
		SET last_row = (SELECT MAX(id) FROM allcats);
		INSERT allcats(virtuemart_category_id)
		SELECT category_child_id as virtuemart_category_id
		FROM ytgb1_virtuemart_category_categories cc
		JOIN sought_cats sc ON sc.virtuemart_category_id = cc.category_parent_id;
		
		INSERT sought_cats(virtuemart_category_id)
		SELECT category_child_id as virtuemart_category_id
		FROM ytgb1_virtuemart_category_categories cc
		JOIN allcats ac ON ac.virtuemart_category_id = cc.category_parent_id AND ac.id > last_row;

		DELETE sc FROM sought_cats sc WHERE id <= last_row;
		
		SET is_there_anybody = (SELECT COUNT(*) FROM sought_cats);
		
	END WHILE;

	INSERT bng347_product_ids(virtuemart_product_id)
	SELECT 
		DISTINCT
		virtuemart_product_id
	FROM ytgb1_virtuemart_product_categories pc
	JOIN allcats USING(virtuemart_category_id);
END//
DELIMITER ;
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите перевести это на язык MYSQL / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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