Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak spowodowac wzajemna wymiane wartosci w dwoch kolumnach?
molo
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2003
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Jak w temacie. Chodzi o to, aby za pomoca jednej instrukcji wymienic wartosci w dwoch kolumnach. W ksiazce Joe Celko "SQL zaawansowane techniki programowania" znalazlem cos takiego:
[sql:1:a6aefc628d]UPDATE Moja_Tabela SET a = b, b = a;[/sql:1:a6aefc628d]
Podobno te dzialania sa rownolegle (jak pisze autor) i powinny dokonac wymiany wartosci. Niestety tak sie nie dzieje :-( W wyniku dostaje dwie takie same kolumny (jedna nadpisuje druga).
Czy orienuje sie ktos moze w jaki sposob dokonac takiej wymiany? Z gory dzieki za pomoc.

Pozdrawiam!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
PMadej
post
Post #2


Vice-Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 395
Pomógł: 0
Dołączył: 7.08.2003
Skąd: Kielce

Ostrzeżenie: (0%)
-----


w jednym zapytaniu przez parser php nie zrobisz tego, już wyjaśniam dlaczego ...

1)obsługuje on tylko pojedyncze zapytanie np:
[php:1:5e972e4283]<?php
$query="select * from tabela";
mysql_query($query,$dblink);
?>[/php:1:5e972e4283]
jest poprawne, ale cos takiego już nie:
[php:1:5e972e4283]<?php
$query="SELECT * FROM tabela; UPDATE tabela SET costam;";
mysql_query($query,$dblink);
?>[/php:1:5e972e4283]
2) problem u ciebie polega na tym ze zapytanie serwer mysql interpresuje nastepujaco:
[sql:1:5e972e4283]
UPDATE Moja_Tabela SET a = b;UPDATE Moja_Tabela SET b = a;
[/sql:1:5e972e4283]
czyli najpierw kolumnie a przypisuje b czyli a=b a nastepnie b przypisuje a(które już równe jest cool.gif wiec masz dwie kolumny o wartosci b;

żeby to rozwiazać musisz zapisać najpierw jedna wartosc do zmiennej, np. tak:
[sql:1:5e972e4283]select @zmienna:=a from tabela;update tabela set a=b, b=@a;
[/sql:1:5e972e4283]
i to napewno spelni to co chcesz zrobic, tylko podkreslam w parserze php musisz zadac to jako dwa osobne zapytania do serwera


--------------------
Go to the top of the page
+Quote Post
adwol
post
Post #3





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

Ostrzeżenie: (0%)
-----


Cytat
w jednym zapytaniu przez parser php nie zrobisz tego

Owszem, zrobi.
Cytat
już wyjaśniam dlaczego ...

1)obsługuje on tylko pojedyncze zapytanie np:
[php:1:b8891e0d20]<?php
$query="select * from tabela";
mysql_query($query,$dblink);
?>[/php:1:b8891e0d20]
jest poprawne, ale cos takiego już nie:
[php:1:b8891e0d20]<?php
$query="SELECT * FROM tabela; UPDATE tabela SET costam;";
mysql_query($query,$dblink);
?>[/php:1:b8891e0d20]
2) problem u ciebie polega na tym ze zapytanie serwer mysql interpresuje nastepujaco:
[sql:1:b8891e0d20]
UPDATE Moja_Tabela SET a = b;UPDATE Moja_Tabela SET b = a;
[/sql:1:b8891e0d20]
czyli najpierw kolumnie a przypisuje b czyli a=b a nastepnie b przypisuje a(które już równe jest cool.gif wiec  masz dwie kolumny o wartosci b;

Nieprawda. Nadal jest to interpretowane jako jedno zapytanie, tylko że MySQL wartościuje wyrażenia od lewej do prawej i stąd się bierze błąd.
Cytat
żeby to rozwiazać musisz zapisać najpierw jedna wartosc do zmiennej, np. tak:
[sql:1:b8891e0d20]select @zmienna:=a from tabela;update tabela set a=b, b=@a;
[/sql:1:b8891e0d20]
i to napewno spelni to co chcesz zrobic, tylko podkreslam w parserze php musisz zadac to jako dwa osobne zapytania do serwera

Tak, tylko, że w tym przypadku mając dwa zapytania, musimy już tworzyć sami transakcję.
Przykładowe rozwiązanie za pomocą jednego zapytania:
[sql:1:b8891e0d20]update tabela set a=(@a:=a),a=b,b=@a[/sql:1:b8891e0d20]

PS. Problem tego typu nie występuje np. w PostgreSQLu i innych bardziej rozbudowanych bazach.
Go to the top of the page
+Quote Post
molo
post
Post #4





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2003
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Dzieki za sugestie!!!
Mam jeszcze jedna wymiane do zrobienia. A mianowicie chcialbym zamienic miejscami wartosci w jednym polu w dwoch rekordach. To znaczy wyglada to mniej wiecej tak:
Kod
--------------

| ID | numer |

--------------

|  8 | num_1 |

| 12 | num_2 |

--------------

Chcialbym w jak najproszy sposob uczynic, aby rekord o ID=8 mial pole numer=num2, a rekord o ID=12 pole numer=num_1. Czyli na odwrot. Aktualnie robie to za pomoca 10 linijek kodu w php, ale to chyba jedno z gorszych rozwiazan.

Pozdrawiam!!!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 14:40