powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите перевести это на язык MYSQL
12 сообщений из 12, страница 1 из 1
Помогите перевести это на язык MYSQL
    #39026522
Здравствуйте.

Прошу помочь перевести на язык 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
Помогите перевести это на язык MYSQL
    #39026537
Немного продвинулся:
Код: 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
Помогите перевести это на язык MYSQL
    #39026543
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то корявый псевдокод...

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


Уж лучше словами объясни, чего надо сделать.
...
Рейтинг: 0 / 0
Помогите перевести это на язык MYSQL
    #39026545
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркункак в цикле можно перебирать каждое значение определённого столбца в таблице строка за строкой?Курсором... только вот зачем ПЕРЕБИРАТЬ? SQL позволяет обработать всё сразу.
...
Рейтинг: 0 / 0
Помогите перевести это на язык MYSQL
    #39026622
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, как я понимаю, ты хочешь организовать итерационный сбор всех то ли родителей, то ли потомков... так?
Присоединяю код - это я делал (уж не помню когда и зачем) пример реализации волнового алгоритма для MySQL. Задача хоть и другая, но суть та же - итерационное сгребание в кучку по матрице связности. Посмотри, вдруг поможет...
...
Рейтинг: 0 / 0
Помогите перевести это на язык MYSQL
    #39026996
Да, вы правильно поняли. Нужно вытащить все дочерние подкатегории указанной параметром категории. При этом дочерние подкатегории хранятся в таблице вида
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
Помогите перевести это на язык MYSQL
    #39027003
то есть задача составить список всех дочерних подкатегорий указанной категории
...
Рейтинг: 0 / 0
Помогите перевести это на язык MYSQL
    #39027014
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркунсоставить список всех дочерних подкатегорий указанной категории 13675569
...
Рейтинг: 0 / 0
Помогите перевести это на язык MYSQL
    #39027039
Спасибо.
Пока получается вот такое:
Код: 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
Помогите перевести это на язык MYSQL
    #39027041
только почему-то возникает ошибка:
автор#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
Помогите перевести это на язык MYSQL
    #39027138
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

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

Получилось в итоге так:
Код: 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
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите перевести это на язык MYSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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