![]() |
![]() |
![]()
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! |
|
|
![]() |
![]()
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 ![]() ż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 -------------------- |
|
|
![]()
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 ![]() 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. |
|
|
![]()
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!!! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 14:40 |