powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на создание новых атрибутов на основе имеющихся
25 сообщений из 79, страница 3 из 4
Запрос на создание новых атрибутов на основе имеющихся
    #39212753
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скрипт значит выдаёт такую штуку.
Когда у товара 2 атрибута
58.3x51.3 см
1050 629 4 1 58.31050 629 4 2 51.3 см1050 629 4 3
Когда 3
7.5 x 28.8 x 51 см
701 629 4 1 7.5701 629 4 2 28.8701 629 4 3 51 см

Путает немного, 1 -это допустим Высота, 2-Ширина 3 - Глубина. Позиция с номером 1050 имеет только ШхГ а поставилось под В и Ш
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212765
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, поставилось 1 и 2. То, что это именно ширина и глубина, знаете вы, сервер об этом откуда может знать?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212800
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Это понятно. Что нужно изменить?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212840
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно ли условие вставить типа if then
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212842
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или допустим сделать отдельный запрос который все атрибуты имеюшие 2 значение перекидывает в другой attribute_id и там уже для них можно запустить этот запрос уже в другом формате.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213156
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius, можно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
case when SUBSTRING_BY_INDEX(text, 'x', 3)='' 
 then case when attr_pos=1 
  then '' 
  else SUBSTRING_BY_INDEX(text, 'x', attr_pos-1) 
  end
 else SUBSTRING_BY_INDEX(text, 'x', attr_pos) 
end
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213235
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответ!
Как его в действующий запрос вставить?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT product_id, attribute_id, language_id, attr_pos, SUBSTRING_BY_INDEX(text, 'x', attr_pos) attr
FROM oc_product_attribute, (SELECT 1 attr_pos UNION SELECT 2 UNION SELECT 3) dummy 
where `attribute_id` = 629 and `language_id` = 4
case when SUBSTRING_BY_INDEX(text, 'x', 3)='' 
 then case when attr_pos=1 
  then '' 
  else SUBSTRING_BY_INDEX(text, 'x', attr_pos-1) 
  end
 else SUBSTRING_BY_INDEX(text, 'x', attr_pos) 
end
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213303
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующая корректировка функции.
Код: sql
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 FUNCTION IF EXISTS SUBSTRING_BY_INDEX;

DELIMITER //

-- Выделение подстроки с заданным номером Number из строки Source по заданному разделителю Delimiter.
-- Если Number отрицательно - отсчёт ведётся с конца.
CREATE FUNCTION SUBSTRING_BY_INDEX(Source VARCHAR(255), Delimiter VARCHAR(255), Number INT)
RETURNS VARCHAR(255)
DETERMINISTIC
NO SQL
BEGIN
DECLARE DelimitersCount INT;
SET DelimitersCount = (LENGTH(Source) - LENGTH(REPLACE(Source, Delimiter, ''))) / LENGTH(Delimiter);
	IF (DelimitersCount >= Number - 1) AND (Number > 0)
		THEN
			RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -1));
	ELSEIF (DelimitersCount >= -Number - 1) AND (Number < 0)
		THEN
			RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, 1));
	ELSE
			RETURN '';
	END IF;


END;
//

DELIMITER ;


Проверка
Код: sql
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.
mysql> SELECT
    ->   pos
    -> , SUBSTRING_BY_INDEX(@str, '.', pos) str
    -> , LENGTH(SUBSTRING_BY_INDEX(@str, '.', pos)) len
    -> FROM (
    ->   SELECT 0 pos UNION 
    ->   SELECT 1 UNION 
    ->   SELECT 2 UNION 
    ->   SELECT 3 UNION 
    ->   SELECT 4 UNION
    ->   SELECT -1 UNION 
    ->   SELECT -2 UNION 
    ->   SELECT -3 UNION 
    ->   SELECT -4) temp;
+-----+------+------+
| pos | str  | len  |
+-----+------+------+
|   0 |      |    0 |
|   1 | 123  |    3 |
|   2 | 456  |    3 |
|   3 | 789  |    3 |
|   4 |      |    0 |
|  -1 | 789  |    3 |
|  -2 | 456  |    3 |
|  -3 | 123  |    3 |
|  -4 |      |    0 |
+-----+------+------+
9 rows in set (0.01 sec)
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213326
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и традиционно "оптимизация":
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DROP FUNCTION IF EXISTS SUBSTRING_BY_INDEX;

DELIMITER //

-- Выделение подстроки с заданным номером Number из строки Source по заданному разделителю Delimiter.
-- Если Number отрицательно - отсчёт ведётся с конца.
CREATE FUNCTION SUBSTRING_BY_INDEX(Source VARCHAR(255), Delimiter VARCHAR(255), Number INT)
RETURNS VARCHAR(255)
DETERMINISTIC
NO SQL
BEGIN
	IF ((LENGTH(Source) - LENGTH(REPLACE(Source, Delimiter, ''))) / LENGTH(Delimiter) >= ABS(Number) - 1) 
		AND (Number != 0)
	THEN
		RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -SIGN(Number)));
	ELSE
		RETURN '';
	END IF;
END;
//

DELIMITER ;
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213433
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вбил прошло.
сам запрос как изменится?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213475
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusсам запрос как изменится?
Судя по
tiraeliusПозиция с номером 1050 имеет только ШхГ а поставилось под В и Ш
тебе надо выделять от конца, а не от начала.
Ну а дальше как бы мозг приложить...
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213774
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Фунцию менять? В самом запросе изменение порядка цифр ничего не дела.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213787
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusизменение порядка цифрВместо 1-2-3 ты использовал 10-20-30? или что имелось в виду под словом "порядок"?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213832
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

ну запрос идёт (SELECT 1 attr_pos UNION SELECT 2 UNION SELECT 3)
я сделал (SELECT 3 attr_pos UNION SELECT 2 UNION SELECT 1)
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213840
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*рукалицо*
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213879
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina*рукалицо*

Ну блин что? Я ж не силён в sql ни разу, когда логику не понимаю то и не знаю что менять.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213893
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или тут надо менять?
Код: sql
1.
2.
3.
4.
5.
		RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -1));
	ELSEIF (DelimitersCount >= -Number - 1) AND (Number < 0)
		THEN
			RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, 1));
	ELSE



Delimiter, -1 на 1
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213905
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusЯ ж не силён в sql ни разу, когда логику не понимаю то и не знаю что менять.А просто прочитать? хрен с им, с кодом - но комментарии, ипона мать, на русском написаны!
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39213926
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinatiraeliusЯ ж не силён в sql ни разу, когда логику не понимаю то и не знаю что менять.А просто прочитать? хрен с им, с кодом - но комментарии, ипона мать, на русском написаны!

Большое спасибо! Значит функцию менять.

В функции меняю

Код: sql
1.
2.
3.
4.
NO SQL
BEGIN
	IF ((LENGTH(Source) - LENGTH(REPLACE(Source, Delimiter, ''))) / LENGTH(Delimiter) >= ABS(Number) 1) 
		AND (Number != 0)




ТАк?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39214088
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор-- Если Number отрицательно - отсчёт ведётся с конца.

В этой стрроке менять?

Код: sql
1.
2.
3.
4.
NO SQL
BEGIN
	IF ((LENGTH(Source) - LENGTH(REPLACE(Source, Delimiter, ''))) / LENGTH(Delimiter) >= ABS(Number) 1) 
		AND (Number != 0)
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39214283
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так скорее, чтобы количество символов было - , верно?. Подскажите кто нить

RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, - Number), Delimiter, -SIGN(Number)));

За вознаграждение готов отблагодарить кто поможет до конца доделать.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39214289
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius , код функции дан в ОКОНЧАТЕЛЬНОМ ВАРИАНТЕ. Не трогайте его. Исправляйте ТОЛЬКО текст запроса с использованием этой функции.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39214311
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina tiraelius , код функции дан в ОКОНЧАТЕЛЬНОМ ВАРИАНТЕ. Не трогайте его. Исправляйте ТОЛЬКО текст запроса с использованием этой функции.




Спасибо что ещё на связи.

Именил запрос на

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT product_id, attribute_id, language_id, attr_pos, SUBSTRING_BY_INDEX(
TEXT,  'x', attr_pos
)attr
FROM oc_product_attribute, (

SELECT -1attr_pos
UNION SELECT -2
UNION SELECT -3
)dummy
WHERE  `attribute_id` =629
AND  `language_id` =4



получилось!

701 629 4 -1 51 см701 629 4 -2 28.8701 629 4 -3 7.5719 629 4 -1 51 см719 629 4 -2 58719 629 4 -3 41026 629 4 -1 51 см1026 629 4 -2 581026 629 4 -3 9.81035 629 4 -1 51 см1035 629 4 -2 601035 629 4 -3 1033 629 4 -1 52 см1033 629 4 -2 591033 629 4 -3 51034 629 4 -1 52 см1034 629 4 -2 591034 629 4 -3 51041 629 4 -1 50.5 см1041 629 4 -2 57.51041 629 4 -3 51042 629 4 -1 52 см1042 629 4 -2 591042 629 4 -3 1044 629 4 -1 52 см1044 629 4 -2 591044 629 4 -3 1049 629 4 -1 51.3 см1049 629 4 -2 58.31049 629 4 -3

Уже почти то что надо. Осталось сделать Insert INTO и добавить всем по см где нет.

см можно добавить так
Код: sql
1.
2.
UPDATE `oc_product` set `model`= concat (model ,'-01') where 
`attr_pos`= 1



Но и Insert сново потребуется помощь...
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39214334
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusполучилось
Добавьте ещё во WHERE условие
Код: sql
1.
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_pos) != ''


Нафига нужны "пустые" атрибуты?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39214359
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinatiraeliusполучилось
Добавьте ещё во WHERE условие
Код: sql
1.
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_pos) != ''


Нафига нужны "пустые" атрибуты?

Да так лучше.

Код: sql
1.
2.
3.
4.
5.
SELECT product_id, attribute_id, language_id, attr_new, SUBSTRING_BY_INDEX(text, 'x', attr_new) attr
FROM oc_product_attribute, (SELECT 1 attr_new UNION SELECT 2 UNION SELECT 3) dummy
where `attribute_id` = 629
and `language_id` = 4
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != ''



новые атрибуты

796 4 Высота797 4 Ширина798 4 Глубина

Под Insert надо attribute_id подставлять новые, как?
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 3 из 4
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на создание новых атрибутов на основе имеющихся
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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