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)'


(Ierakstīt jaunu komentāru)


[info]aiks
2003-07-07 11:09 (saite)
:)
klasiskais risinaajums, aizmirsu kursh pirmais shito izdomaaja, bet ja nemaldos bija viens no algoritmu guru, kursh ieksh fortra nshito pirmo reizi izdariija .. - pats arii shito esmu n-taas reizes izmantojis

(Atbildēt uz šo) (Diskusija)


[info]aiks
2003-07-07 11:17 (saite)
tur gan ideja bija sekojosha - nepiecieshams, lai dabuutu sakojoshus veertibu rindu - (1,0,1,0,1,0,1,0,1 .... ) un tad nu ciklaa -
x=abs(x-1) ... shito btw var arii webaa shur tur izmantot, kur jaadabon - viena tumshi peleeka, otra gaishi peleeka striipinja u.t.t tabulas formateeshanai...

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


[info]skalpelis
2003-07-07 11:48 (saite)
oho :)
Kārtējo reizi izgudroju velosipēdu :)

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


[info]aiks
2003-07-07 12:03 (saite)
btw, ja nemaldos shams par to pat kaadu preemiju or balvu sanjeema, neatceros

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

background info
[info]laacz
2003-07-07 12:21 (saite)

Kāpēc visu sarežģīt? :)

update table set status = not status

(Atbildēt uz šo) (Diskusija)

Re: background info
[info]smejmoon
2003-07-07 13:08 (saite)
incanti tas ir loģiskais vai binārais not? :P

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

Re: background info
[info]skalpelis
2003-07-07 18:25 (saite)
0 not 1 = vismaz 254 ;)
ja tips ir vairāk kā vienu baitu garš, tad vispār ir, ja nemaldos, 65536.
Jo, kā jau sm bilda, tas šeitan ir binārais not :)

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

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)


[info]murks
2003-07-07 21:11 (saite)
kaapeec ne taa:

'update table set status = 1 - status'

?

(Atbildēt uz šo)


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