SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.05.2012 22:18:11

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Подскажите, как лучше сделать

Приветствую!
Есть две задачи. Подскажите пожалуйста, как лучше всего их реализовать:

1. Есть две таблицы t1 и t2, у них есть одно поле name и в нем есть какие-то числа. Какой запрос нужно написать, чтобы получить значения, которые есть в t1, но нет в t2 и наоборот? Я так понимаю нужно использовать JOIN или через NOT IN?

2. Есть таблица tab и в ней два поля name1 и name2 с произвольными данными. Как поменять местами данные у этих двух полей?

Неактивен

 

#2 02.05.2012 23:00:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите, как лучше сделать

Здравствуйте.

1) Ну да, либо
select name from t1 where name not in (select name from t2)
union
select name from t2 where name not in (select name from t1)

(Что хуже)
либо
SELECT t1.name FROM t1 join t2 using(name);
(что лучше)

2) set @tmp='';UPDATE t_5678 SET n1=(@tmp:=n1), n1=n2, n2=@tmp;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 02.05.2012 23:10:21

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Подскажите, как лучше сделать

1)
UNCROSS FULL OUTER JOIN

SELECT `TableA`.*, `TableB`.* FROM
TableA LEFT JOIN `TableB`
USING (`name`)
WHERE `TableB`.`name` IS NULL
UNION SELECT `TableA`.*, `TableB`.* FROM `TableB `
LEFT JOIN `TableA` USING (`name`)
WHERE `TableA`.`name` IS NULL

https://docs.google.com/document/pubimage?id=1xd0Ukta6UTyFDClF-MU4l8oG_NylXtp_ftzejT5T8cA&image_id=1f54Bz7HRRkTo57vpme-aQMokanhmFp8


2)
можно так
update mytable set name1=@a,name2=@b where id=4 and (@a:=name2) and (@b:=name1);


можно так
update mytable a,(select * from mytable) b
set a.name1=t.name2,a.name2=t.name1 where a.id=t.id and a.id=5;

Неактивен

 

#4 02.05.2012 23:13:06

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Подскажите, как лучше сделать

deadka
По первому все круто!
А вот по второму пункту не получается так. В результате такого запроса в обоих полях будут одинаковые значения, т.е. какого-то одного поля

Отредактированно Garik (02.05.2012 23:13:52)

Неактивен

 

#5 02.05.2012 23:18:11

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Подскажите, как лучше сделать

evgeny
По 1-му работает. А на счет второго не понял что за id=4 и id=5

Неактивен

 

#6 02.05.2012 23:26:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите, как лучше сделать

Garik написал:

deadka
По первому все круто!
А вот по второму пункту не получается так. В результате такого запроса в обоих полях будут одинаковые значения, т.е. какого-то одного поля

Да, во-втором погорячился. Вот так работает:
set @tmp='';UPDATE t_5678 SET n1=(@tmp:=n1), n1=n2, n2=@tmp;
А по первому оба варианта работают?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 02.05.2012 23:36:25

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Подскажите, как лучше сделать

deadka написал:

Да, во-втором погорячился. Вот так работает:
set @tmp='';UPDATE t_5678 SET n1=(@tmp:=n1), n1=n2, n2=@tmp;

Ага, сейчас все норм!

deadka написал:

А по первому оба варианта работают?

Ну первый выдает те поля, которые отличаются, а второй общие (тоже пригодится).

Спасибо за помощь!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson