Как поменять местами несколько слов через запрос

NLO56
Дата: 13.01.2013 19:52:54
Доброго всем время суток.
Вопрос такого плана. Можно ли поменять несколько слов местами.
Для полноты опишу что к чему.
Существует страничка с названием: BMW 3 E30 0982- 90 КРЫЛО ПЕРЕДНЕЕ L
0982- 90 есть месяц и год. Приводим к понятному языку с 09.1982г - 1090г
Делаем запрос на изменение этой части:

UPDATE `xsil_products`
SET `title`= REPLACE(`title`, '0982- 90', 'с 09.1982г - 1990г');

UPDATE `xsil_products`
SET `name`= REPLACE(`name`, '0982- 90', 'с 09.1982г - 1990г');

UPDATE `xsil_products`
SET `description`= REPLACE(`description`, '0982- 90', 'с 09.1982г - 1990г');

UPDATE `xsil_products`
SET `brief_description`= REPLACE(`brief_description`, '0982- 90', 'с 09.1982г - 1990г');

UPDATE `xsil_products`
SET `meta_description`= REPLACE(`meta_description`, '0982- 90', 'с 09.1982г - 1990г');

UPDATE `xsil_products`
SET `meta_keywords`= REPLACE(`meta_keywords`, '0982- 90', 'с 09.1982г - 1990г');


Все хорошо, в результате получили что требовалось: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L

Вот теперь собственно о чем вопрос. Нужно привести к такому состоянию страницу: КРЫЛО ПЕРЕДНЕЕ L BMW 3 E30 с 09.1982г - 1990г (т.е перенести все что находится после года в начало)

Переписать саму страницу в ручную конечно можно, но страниц более 30000
Можно ли с помощью запроса добиться желаемого, как? подскажите пожалуйста.
Stupid_BOT
Дата: 13.01.2013 20:51:49
NLO56,
+

mysql> create table t$126DC3(data text,dataold text)
    -> -- поле dataold - только для сравнения результата
    -> ;
Query OK, 0 rows affected (0.09 sec)

mysql> insert into t$126DC3 values(
    -> 'BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L',
    -> 'BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L'
    -> );
Query OK, 1 row affected (0.06 sec)

mysql> select data,dataold from t$126DC3\G
*************************** 1. row ***************************
   data: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L
dataold: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L
1 row in set (0.00 sec)

mysql> update t$126DC3,
    -> (select @P:='с 09.1982г - 1990г' PATTERN, @L:=length(@P) PATTERNLEN) a
    -> set data=concat(substring(data,instr(data,@P)+@L+1),' ',left(data,instr(data,@P)+@L-1));
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select data,dataold from t$126DC3\G
*************************** 1. row ***************************
   data: КРЫЛО ПЕРЕДНЕЕ L BMW 3 E30 с 09.1982г - 1990г
dataold: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L
1 row in set (0.00 sec)

mysql> drop table t$126DC3;
Query OK, 0 rows affected (0.08 sec)
NLO56
Дата: 17.01.2013 17:56:33
Stupid_BOT
NLO56,
+
+

mysql> create table t$126DC3(data text,dataold text)
    -> -- поле dataold - только для сравнения результата
    -> ;
Query OK, 0 rows affected (0.09 sec)

mysql> insert into t$126DC3 values(
    -> 'BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L',
    -> 'BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L'
    -> );
Query OK, 1 row affected (0.06 sec)

mysql> select data,dataold from t$126DC3\G
*************************** 1. row ***************************
   data: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L
dataold: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L
1 row in set (0.00 sec)

mysql> update t$126DC3,
    -> (select @P:='с 09.1982г - 1990г' PATTERN, @L:=length(@P) PATTERNLEN) a
    -> set data=concat(substring(data,instr(data,@P)+@L+1),' ',left(data,instr(data,@P)+@L-1));
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select data,dataold from t$126DC3\G
*************************** 1. row ***************************
   data: КРЫЛО ПЕРЕДНЕЕ L BMW 3 E30 с 09.1982г - 1990г
dataold: BMW 3 E30 с 09.1982г - 1990г КРЫЛО ПЕРЕДНЕЕ L
1 row in set (0.00 sec)

mysql> drop table t$126DC3;
Query OK, 0 rows affected (0.08 sec)

Спасибо огромное.
Ошибка при переносе получается. Делаю так:
UPDATE xsil_products,
(select @P:='с 09.1982г - 1990г' PATTERN, @L:=length(@P) PATTERNLEN) a
SET title=concat(substring(title,instr(title,@P)+@L+1),' ',left(title,instr(title,@P)+@L-1));


Получилось так: ЛО ПЕРЕДНЕЕ L BMW 3E30 с 09.1982г - 1990г КР

Ы кудато пропало и КР на месте осталось. Подскажите что где не так получилось?
javajdbc
Дата: 17.01.2013 18:47:57
NLO56,

там где +1 и -1 -- поставьте другие циферки, типа ноль или 2
или минус, или плюс...
В какой-то момент попадете правильно.
Stupid_BOT
Дата: 17.01.2013 19:35:40
javajdbc
NLO56,

там где +1 и -1 -- поставьте другие циферки, типа ноль или 2
или минус, или плюс...
В какой-то момент попадете правильно.


+- 0,1,2 - не поможет. Там в строке 3 двухбайтных символа :(
Stupid_BOT
Дата: 17.01.2013 19:46:16
NLO56
Спасибо огромное.
Ошибка при переносе получается. Делаю так:
UPDATE xsil_products,
(select @P:='с 09.1982г - 1990г' PATTERN, @L:=length(@P) PATTERNLEN) a
SET title=concat(substring(title,instr(title,@P)+@L+1),' ',left(title,instr(title,@P)+@L-1));


Получилось так: ЛО ПЕРЕДНЕЕ L BMW 3E30 с 09.1982г - 1990г КР

Ы кудато пропало и КР на месте осталось. Подскажите что где не так получилось?



1) невнимательно копировали запрос. У меня в конце запроса -1 (минус), у Вас +1 (плюс). Потому и потерялось 'Ы'

2) у вас в базе многобайтовая кодировка. Надо заменить в запросе функцию определения длины строки.
UPDATE xsil_products,
(select @P:='с 09.1982г - 1990г' PATTERN, @L:=char_length(@P) PATTERNLEN) a
SET title=concat(substring(title,instr(title,@P)+@L+1),' ',left(title,instr(title,@P)+@L-1));
Stupid_BOT
Дата: 18.01.2013 04:16:33
NLO56,

ЗЫ: можно обойтись и без переменных
+
update xsil_products, (select 'с 09.1982г - 1990г' pattern) a
set title=concat(
		trim(leading from substring_index(title,pattern, -1)) -- здесь минус 1
		,' '
		,substring_index(title,pattern, 1)                    -- здесь 1
		,pattern)
-- и желательно условие добавить :)
where instr(title,pattern)>0;
NLO56
Дата: 21.01.2013 22:58:00
Stupid_BOT
NLO56
Спасибо огромное.
Ошибка при переносе получается. Делаю так:
UPDATE xsil_products,
(select @P:='с 09.1982г - 1990г' PATTERN, @L:=length(@P) PATTERNLEN) a
SET title=concat(substring(title,instr(title,@P)+@L+1),' ',left(title,instr(title,@P)+@L-1));


Получилось так: ЛО ПЕРЕДНЕЕ L BMW 3E30 с 09.1982г - 1990г КР

Ы кудато пропало и КР на месте осталось. Подскажите что где не так получилось?



1) невнимательно копировали запрос. У меня в конце запроса -1 (минус), у Вас +1 (плюс). Потому и потерялось 'Ы'

2) у вас в базе многобайтовая кодировка. Надо заменить в запросе функцию определения длины строки.
UPDATE xsil_products,
(select @P:='с 09.1982г - 1990г' PATTERN, @L:=char_length(@P) PATTERNLEN) a
SET title=concat(substring(title,instr(title,@P)+@L+1),' ',left(title,instr(title,@P)+@L-1));

Да, все вроде хорошо, только опять ошибки вылазят. Теперь вот такого плана.
Делаем запрос:
UPDATE xsil_products,
(select @P:='с 1991г - 1994г' PATTERN, @L:=char_length(@P) PATTERNLEN) a
SET name=concat(substring(name,instr(name,@P)+@L+1),' ',left(name,instr(name,@P)+@L-1));

AUDI 80 с 1991г - 1994г ЛОКЕР ЗАДНИЙ ЛЕВЫЙ ( получился правильно ЛОКЕР ЗАДНИЙ ЛЕВЫЙ AUDI 80 с 1991г - 1994г)
и все что относится к (с 1991г - 1994г) перекидывает нормально.
А вот к примеру:
FORD TRANSIT с 08.1991г - 08.1994г 25TD РАДИАТОР 600X355 M
получается:
08.1991г - 08.1994г 25TD РАДИАТОР 600X355 M FORD TRANSIT
а из:
MAZDA 323 (SEDAN) с 03.1991г - 1994г КАПОТ
получилось:
N) с 03.1991г - 1994г КАПОТ MAZDA 323 (SED
DBConstructor
Дата: 22.01.2013 02:54:04
NLO56,
Если данные по запчастям хранятся в базе, реструктурируйте её для нормализации, а для выборки напишите вьюшку.
Тем самым сможете уменьшить размер БД, упростить выборку и гибко менять расположение частей полного наименования запчасти не внося изменений в данные.
Stupid_BOT
Дата: 22.01.2013 07:28:19
NLO56
> и все что относится к (с 1991г - 1994г) перекидывает нормально.
> А вот к примеру:
> ...

ДЛЯ КАЖДОГО ПЕРИОДА НУЖЕН СВОЙ "ПАТТЕРН".
Для запросов из своего первого сообщения вы же где-то брали пары строк для REPLACE.