Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поменять данные местами по id одним запросом 
V
    Опции темы
maxipub
  Дата 30.12.2015, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день!

Есть таблица с полями id (AI), и некие data_1, data 2, data_3. Нужно поменять местами информацию в data_1, data 2, data_3 по двум конкретным id. Например:

Код
id    data_1    data_2    data_3
------------------------------
1    qw    aaa    =)
2    er    bbb    =))
3    ty    ccc    =)))


Меняем местами data_1, data 2, data_3 у id = 1 и id = 3, получаем:

Код
id    data_1    data_2    data_3
------------------------------
1    ty    ccc    =)))
2    er    bbb    =))
3    qw    aaa    =)


Подскажите, такое можно сделать одним запросом?

Заранее огромное спасибо.

Это сообщение отредактировал(а) maxipub - 30.12.2015, 18:37
PM MAIL   Вверх
Akina
Дата 30.12.2015, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



RTFM Multi-table UPDATE Syntax


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 31.12.2015, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, честно, вчера читал. Читал МАН, читал статьи, читал форумы, искал. Перед созданием темы всегда ищу. Но ничего не понял, и не нашел...

Только что вот еще раз прошелся. Ну кое-что вроде нарисовывается. Просто первый раз с таким сталкиваюсь. Тестировать то буду, но это разработка на работающий проект, поэтому необходимо все сделать с первого раза без скрытых косяков.

Таблица:

Код
--
-- Структура таблицы `test`
--

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data_1` varchar(8) NOT NULL,
  `data_2` varchar(8) NOT NULL,
  `data_3` varchar(8) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `test`
--

INSERT INTO `test` (`id`, `data_1`, `data_2`, `data_3`) VALUES
(1, 'qw', 'aaa', '=)'),
(2, 'er', 'bbb', '=))'),
(3, 'ty', 'ccc', '=)))');


Запрос:

Код
UPDATE `test` AS t1 
INNER JOIN `test` AS t2 ON (t1.id = 1 AND t2.id = 3) 

SET 

t1.data_1 = t2.data_1, 
t1.data_2 = t2.data_2, 
t1.data_3 = t2.data_3, 

t2.data_1 = t1.data_1, 
t2.data_2 = t1.data_2, 
t2.data_3 = t1.data_3;


Вроде работает. Но все ли правильно? smile 
PM MAIL   Вверх
Akina
Дата 31.12.2015, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Для id UNIQUE - да, всё правильно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 31.12.2015, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Круто, я раньше почему-то считал что JOIN только для SELECT. Все намного интересней. smile 
PM MAIL   Вверх
maxipub
Дата 8.7.2016, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Ребята, тут возник еще один вопрос по запросу, id - UNIQUE:

Код
UPDATE `test` AS t1 
INNER JOIN `test` AS t2 ON (t1.id = 1 AND t2.id = 3) 
SET 
t1.data_1 = t2.data_1, 
t1.data_2 = t2.data_2, 
t1.data_3 = t2.data_3, 
t2.data_1 = t1.data_1, 
t2.data_2 = t1.data_2, 
t2.data_3 = t1.data_3
WHERE t1.status='ok' AND t2.status='ok';


Я правильно понимаю, что количество измененных строк всегда будет = только 2 или только 0 (не прошел INNER JOIN или WHERE), или может быть другой вариант, и в каких случаях?
PM MAIL   Вверх
Akina
Дата 8.7.2016, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Поскольку ID уникальный, то условие связывание в каждой копии может дать или 0 записей, или 1. Соответственно произведение тоже даст или 0, или 1 ПАРУ записей. Т.е. изменится или 0 пар записей, или 1 пара, что соответствует 0 или 2 записям.
Даже если ID отбираемых записей параметризовать и задать равные значения, то формально изменится 1 пара, но т.к. запись одна, актического изменения не будет, т.е. изменится 0 записей.

Формально другой вариант возможен. Это - невыполнение запроса по любой причине (любая ошибка). И количество изменившихся записей при этом может быть любым - от нуля и до всех (скажем, при полном разрушении таблицы).

И... нафига тут вообще JOIN? По-моему, декарт читабельнее:
Код

UPDATE `test` AS t1
     , `test` AS t2 
SET 
t1.data_1 = t2.data_1, 
t1.data_2 = t2.data_2, 
t1.data_3 = t2.data_3, 
t2.data_1 = t1.data_1, 
t2.data_2 = t1.data_2, 
t2.data_3 = t1.data_3
WHERE t1.id = 1
  AND t1.status='ok' 
  AND t2.id = 3 
  AND t2.status='ok';



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 8.7.2016, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  8.7.2016,  12:49 Найти цитируемый пост)
И... нафига тут вообще JOIN?

По-другому не умеем. smile 

Цитата(Akina @  8.7.2016,  12:49 Найти цитируемый пост)
 По-моему, декарт читабельнее:

Да, немного лучше. smile 

Спасибо снова и снова за замечательную помощь! smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1401 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.