Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на создание новых атрибутов на основе имеющихся / 25 сообщений из 79, страница 1 из 4
08.04.2016, 10:15
    #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
08.04.2016, 11:12
    #39210853
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
А в чём сложности? выкусывайте по одному атрибуту с использованием SUBSTRING_INDEX() и добавляйте в таблицу. Всего получится три запроса.
...
Рейтинг: 0 / 0
10.04.2016, 16:39
    #39211955
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
в SQL не силён, поэтому прошу помощи
...
Рейтинг: 0 / 0
11.04.2016, 09:27
    #39212191
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
up
...
Рейтинг: 0 / 0
11.04.2016, 09:31
    #39212197
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
AkinaА в чём сложности? выкусывайте по одному атрибуту с использованием SUBSTRING_INDEX() и добавляйте в таблицу. Всего получится три запроса.
Из описания, эта функция берёт количество все символы до и после разделителя. В моём же примере нужно барть ещё из серидины, между разделителями.

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

Код: sql
1.
substring_index(substring_index(string,'x',номер),'x',-1)
...
Рейтинг: 0 / 0
11.04.2016, 09:59
    #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
11.04.2016, 10:03
    #39212232
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
SUBSTRING_INDEX возвращает строку. Вам, наверное, надо её с чем-то сравнить?..
...
Рейтинг: 0 / 0
11.04.2016, 10:05
    #39212234
anvano
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
tanglirSUBSTRING_INDEX возвращает строку. Вам, наверное, надо её с чем-то сравнить?..

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

тогда см. пост anvano.
...
Рейтинг: 0 / 0
11.04.2016, 10:14
    #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
11.04.2016, 10:17
    #39212259
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
tiraelius , поскольку там в данных ещё дофига лишних пробелов, нужно после каждого SUBSTRING_INDEX() тримать оставшуюся часть.

tiraeliusWHERE SUBSTRING_INDEX( SUBSTRING_INDEX( `text` , 'x', 1 ) , 'x' , -1 )
Это условие проверяет, что выражение хоть что-то возвращает. А оно обязательно что-то вернёт, если в поле text имеется хотя бы один символ, не равный пробелу или 'x'.
...
Рейтинг: 0 / 0
11.04.2016, 10:34
    #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
11.04.2016, 10:42
    #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
11.04.2016, 10:55
    #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
11.04.2016, 11:06
    #39212314
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
tiraelius,

а вы почитайте про union all - глядишь, и вопрос отпадёт сам собой.
...
Рейтинг: 0 / 0
11.04.2016, 11:12
    #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
11.04.2016, 11:27
    #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
11.04.2016, 11:34
    #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
11.04.2016, 11:35
    #39212366
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
tanglirtiraelius,

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

Почитал, про t0 так и не понял. :|
...
Рейтинг: 0 / 0
11.04.2016, 11:47
    #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
11.04.2016, 11:49
    #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
11.04.2016, 11:50
    #39212381
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на создание новых атрибутов на основе имеющихся
tiraelius,

данные, из которых производится select, получаются подзапросом. каждый подзапрос должен иметь свой алиас(имя). вот "t0" и есть это имя.
...
Рейтинг: 0 / 0
11.04.2016, 11:54
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на создание новых атрибутов на основе имеющихся / 25 сообщений из 79, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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