powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на создание новых атрибутов на основе имеющихся
25 сообщений из 79, страница 1 из 4
Запрос на создание новых атрибутов на основе имеющихся
    #39210792
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!
Помогите сделать запросик.

Имееются товары с атрибутами такого вида.
product_id attribute_id language_id text701 629 4 7.5 x 28.8 x 51 см719 629 4 4 x 58 x 51 см1026 629 1 9.8x58x51 см1033 629 4 5x59x52 см

text это размер ВхШхГ .
Создать новые атрибуты с уникальными attribute_id(Высота,Ширина,Глубина) и к каждому товару в зависимости от поля text добавить ещё атрибуты.У многих товаров есть только ШхГ и тут нужно делать только по 2-м параметрам.
т.е
Должно быть так на примере product_id 701
product_id attribute_id language_id text701 999 4 7.5 см701 998 4 28.8 cм701 997 4 51 см
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39210853
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём сложности? выкусывайте по одному атрибуту с использованием SUBSTRING_INDEX() и добавляйте в таблицу. Всего получится три запроса.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39211955
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в SQL не силён, поэтому прошу помощи
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212191
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212197
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА в чём сложности? выкусывайте по одному атрибуту с использованием SUBSTRING_INDEX() и добавляйте в таблицу. Всего получится три запроса.
Из описания, эта функция берёт количество все символы до и после разделителя. В моём же примере нужно барть ещё из серидины, между разделителями.

Как между х**х взять? Притом этот параметр может быть в виде 52.2 или 58.88 или же 40 т.е количество символов разное.
**х**х**
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212215
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius,

Код: sql
1.
substring_index(substring_index(string,'x',номер),'x',-1)
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212227
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirtiraelius,

Код: sql
1.
substring_index(substring_index(string,'x',номер),'x',-1)


Спасибо за ответ.

делаю так
SELECT * FROM `oc_product_attribute`
WHERE SUBSTRING_INDEX( SUBSTRING_INDEX( `text` , 'x', 1 ) , 'x' , -1 )
AND `attribute_id` =629

Если добавляю and и `attribute_id` то SUBSTRING_INDEX не фильтрует. Что я делаю не так?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212232
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SUBSTRING_INDEX возвращает строку. Вам, наверное, надо её с чем-то сравнить?..
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212234
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirSUBSTRING_INDEX возвращает строку. Вам, наверное, надо её с чем-то сравнить?..

или перенести её из раздела WHERE в раздел SELECT, если её надо получить в качестве результата.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212239
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirSUBSTRING_INDEX возвращает строку. Вам, наверное, надо её с чем-то сравнить?..
Не совсем понимаю как сравнивать с чем и зачем. Нужно из определённых атрибутов(например 629) к которым привязан text вытащить значение ВхШхГ и записать в эту же таблицу но под новым атрибутом.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212241
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius,

тогда см. пост anvano.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212252
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
anvanotanglirSUBSTRING_INDEX возвращает строку. Вам, наверное, надо её с чем-то сравнить?..

или перенести её из раздела WHERE в раздел SELECT, если её надо получить в качестве результата.

Спасибо за подсказку.
Делаю так
SELECT `product_id` , `attribute_id` , SUBSTRING_INDEX( SUBSTRING_INDEX( `text` , 'x', 2 ) , 'x' , -1 )
FROM `oc_product_attribute`
WHERE `attribute_id` =629

Выдаёт то что нужно.
Но как я и говорил есть позиции у которых есть ВхШхГ но и те у которых нет одного параметра а есть только ШхГ. и нужно Доп фильтровать такие позиции. Пробывал like '%x%' но так не срабатывает
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212259
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius , поскольку там в данных ещё дофига лишних пробелов, нужно после каждого SUBSTRING_INDEX() тримать оставшуюся часть.

tiraeliusWHERE SUBSTRING_INDEX( SUBSTRING_INDEX( `text` , 'x', 1 ) , 'x' , -1 )
Это условие проверяет, что выражение хоть что-то возвращает. А оно обязательно что-то вернёт, если в поле text имеется хотя бы один символ, не равный пробелу или 'x'.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212285
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina tiraelius , поскольку там в данных ещё дофига лишних пробелов, нужно после каждого SUBSTRING_INDEX() тримать оставшуюся часть.

tiraeliusWHERE SUBSTRING_INDEX( SUBSTRING_INDEX( `text` , 'x', 1 ) , 'x' , -1 )
Это условие проверяет, что выражение хоть что-то возвращает. А оно обязательно что-то вернёт, если в поле text имеется хотя бы один символ, не равный пробелу или 'x'.

Спасибо за ответ. Да есть пробелы в тексте и замыкающий параметр имеет приписку см. Непойму как TRIM вписать в SELECT.
Делаю так
SELECT `product_id`,`attribute_id`, TRIM(BOTH,'' FROM substring_index(substring_index(`text`,'x',2),'x',-1) FROM `oc_product_attribute`
where
`attribute_id` = 629
но терплю фиаско.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212291
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusно терплю фиаско.Что, сервер прямо так и говорит "хозяин, мы потерпели фиаско!". Или всё-таки выводит сообщение об ошибке?
ЗЫ.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT `product_id`,`attribute_id`
, TRIM(BOTH '' FROM substring_index(substring_index(`text`,'x',2),'x',-1))

from (
select 701 product_id, 629 attribute_id, 4 language_id, '7.5 x 28.8 x 51 см' `text`
union all select 719 ,629 ,4 ,'4 x 58 x 51 см'
) t0

where 
`attribute_id` = 629

результат:product_idattribute_idTRIM(BOTH '' FROM substring_index(substring_index(`text`,'x',2),'x',-1))701629 28.8 719629 58 ЧЯДНТ?
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212302
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirtiraeliusно терплю фиаско.Что, сервер прямо так и говорит "хозяин, мы потерпели фиаско!". Или всё-таки выводит сообщение об ошибке?
ЗЫ.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT `product_id`,`attribute_id`
, TRIM(BOTH '' FROM substring_index(substring_index(`text`,'x',2),'x',-1))

from (
select 701 product_id, 629 attribute_id, 4 language_id, '7.5 x 28.8 x 51 см' `text`
union all select 719 ,629 ,4 ,'4 x 58 x 51 см'
) t0

where 
`attribute_id` = 629

результат:product_idattribute_idTRIM(BOTH '' FROM substring_index(substring_index(`text`,'x',2),'x',-1))701629 28.8 719629 58 ЧЯДНТ?

Спасибо !
А что за t0 ?
Делаю так
SELECT `product_id`,`attribute_id`
, TRIM(BOTH '' FROM substring_index(substring_index(`text`,'x',2),'x',-1))
from (
select product_id, attribute_id, language_id, text
union all select
) t0
where
`attribute_id` = 629
Ругается
#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 ') t0
where
`attribute_id` = 629' at line 6
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212314
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius,

а вы почитайте про union all - глядишь, и вопрос отпадёт сам собой.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212329
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользуйся...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DROP FUNCTION IF EXISTS SUBSTRING_BY_INDEX;

DELIMITER //

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
		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.
mysql> SET @str = '123. 456 .789';
Query OK, 0 rows affected (0.00 sec)

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

DELIMITER //

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) >= Number - 1) AND (Number > 0)
		THEN
			RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -1));
		ELSE
			RETURN '';
	END IF;
END;
//

DELIMITER ;
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212362
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо за ответ.
Я в SQL не силён.Непойму как использовать... Надо подставить значения в данные строки, вот так?

CREATE FUNCTION SUBSTRING_BY_INDEX(text VARCHAR(255), x VARCHAR(255), 1 INT)
IF ((LENGTH(text) - LENGTH(REPLACE(text, x, ''))) / LENGTH(x) >= 1 - 1) AND (1 > 0)
THEN
RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(text, x, 1), x, -1));
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212366
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirtiraelius,

а вы почитайте про union all - глядишь, и вопрос отпадёт сам собой.

Почитал, про t0 так и не понял. :|
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212376
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusЯ в SQL не силён.Непойму как использовать...
Первый код (в исправленном варианте) запустить однократно.
После этого станет доступна функция SUBSTRING_BY_INDEX(), которую можно использовать в любых запросах.
Пример её использования - во втором блоке кода.

Т.е. твой запрос будет выглядеть типа
Код: sql
1.
2.
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
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212380
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня ощущение что мы уходим в другую сторону.

Вот запрос который работает
Код: sql
1.
2.
3.
4.
5.
SELECT `product_id`,`attribute_id`, TRIM(BOTH '' FROM substring_index(substring_index(`text`,'x',2),'x',-1))
from 
`oc_product_attribute`
where 
`attribute_id` = 629


701 629 28.8702 629 51 см703 629 51 см

Вот сами записи
701 629 4 7.5 x 28.8 x 51 см 701 629 1 7.5 x 28.8 x 51 см 702 629 1 29 x 51 см 703 629 1 58 x 51 см

Нужно
что бы получилось, как пример
999 - Высота
998 - Ширина
997 - Глубина

701 999 4 7.5см702 997 4 51 см703 998 4 58 см

Т.е добавить всем по см и отфильтровать ВхШхГ от ШхГ чтобы не получилось каши.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212381
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius,

данные, из которых производится select, получаются подзапросом. каждый подзапрос должен иметь свой алиас(имя). вот "t0" и есть это имя.
...
Рейтинг: 0 / 0
Запрос на создание новых атрибутов на основе имеющихся
    #39212384
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinatiraeliusЯ в SQL не силён.Непойму как использовать...
Первый код (в исправленном варианте) запустить однократно.
После этого станет доступна функция SUBSTRING_BY_INDEX(), которую можно использовать в любых запросах.
Пример её использования - во втором блоке кода.

Т.е. твой запрос будет выглядеть типа
Код: sql
1.
2.
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



Вот что выдаёт

Код: 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.
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.
54.
Вероятно, SQL-запрос содержит ошибку. При наличии таковой, ниже будет выведена ошибка MySQL-сервера, облегчающая диагностику проблемы.

ERROR: Неизвестная пунктуация @ 108
STR: //
SQL: DROP FUNCTION IF EXISTS SUBSTRING_BY_INDEX;# MySQL вернула пустой результат (т.е. ноль строк).


DELIMITER //

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) >= Number - 1) AND (Number > 0)
		THEN
			RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -1));
		ELSE
			RETURN '';
	END IF;
END;
//

DELIMITER ;

DELIMITER //

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) >= Number - 1) AND (Number > 0)
		THEN
			RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -1));
		ELSE
			RETURN '';
	END IF;
END;
//

DELIMITER ;

SQL-запрос:

DELIMITER // 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) >= Number - 1) AND (Number > 0) THEN RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -1)); ELSE RETURN ''; END IF; END; // DELIMITER ;

Ответ 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 'RETURNS VARCHAR(255)
DETERMINISTIC
NO SQL
BEGIN
    IF ((LENGTH(Source) - LENGT' at line 1
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 1 из 4
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на создание новых атрибутов на основе имеющихся
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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