Mārtiņš ([info]skalpelis) rakstīja [info]koderi kopienā,
@ 2003-07-07 00:47:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
MySQL 3.23 vs. 4.0
Viena no uzkrītošākajām atšķirībām, ko esmu pamanījis starp MySQL 3.23 un 4 ir tā, ka 3.23 nav tādas operācijas kā xor jeb ^.

Xor būtība - varētu tulkoties kā vai arī - binārā operācija - atgriež true tad, ja tikai viens no abiem apgalvojumiem ir patiess, t.i.:
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false

Taču, kā jau esmu dzirdējis, nafig tāds vajadzīgs?
Pieņemsim, ir tabula ar 5000 rindām, katrā ir statuss, kas atzīmējas ar 1 vai 0. Kā varētu rīkoties, ja visām rindām vajadzētu uzstādīt pretējo statusu? Varētu uzrakstīt skriptu, kas katras rindas statusu izvelk laukā, tad ar kaut kādus skriptu, popularitātes pēc pieņemsim, php, apgriežam uz pretējo un ievietojam iekšā. 5001 querys kā minimums. Jo vairāk, ja tas ir nepieciešams pietiekami bieži, tas sanāk nepiedodami daudz, protams.
Priekš tā arī var izmantot paredzēts xor.
'update table set status = status ^ 1' (tas ir tikai piemērs, protams).
voila

Stāsts, protams, nav par to. Doma man bija tāda - bija uzrakstīts php skripts, kas līdzīgā veidā izdarījās ar mysql. Uz datora, uz kura testējos, stāv uzlikts MySQL 4.0.13. Savukārt uz paredzamā servera, uz kura tam būs jābūt, ir MySQL 3.23 (precīzi nepateikšu, kurš, nezinu).
Un gribas atrisināt šo problēmu, tomēr ar ne vairāk kā vienu queryu. Tā rezultātā tapa:
'update table set status = abs(status - 1)'


(Lasīt komentārus) - (Ierakstīt jaunu komentāru)

background info
[info]laacz
2003-07-07 18:34 (saite)
mysql> create table test (status integer(16));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into test values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values(0);
Query OK, 1 row affected (0.00 sec)

mysql> update test set status = not status;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from test;
+--------+
| status |
+--------+
|      0 |
|      1 |
+--------+
2 rows in set (0.00 sec)

mysql> update test set status = not status;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from test;
+--------+
| status |
+--------+
|      1 |
|      0 |
+--------+
2 rows in set (0.00 sec)

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)

Re: background info
[info]skalpelis
2003-07-07 20:05 (saite)
nu labi, loģiskais :)

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)

Re: background info
[info]smejmoon
2003-07-09 13:52 (saite)
značit binārās operācijas tur nav?

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)

Re: background info
[info]skalpelis
2003-07-10 23:30 (saite)
ir, protams:
| - or
& - and
^ - xor (un, protams, 3.23 tāds nav)
<< - shiftleft
>> - shiftright
~ - invert (kas arī tika sajaukts ar not)

(Atbildēt uz šo) (Iepriekšējais)


(Lasīt komentārus) -

Neesi iežurnalējies. Iežurnalēties?