PDA

Pogčedajte punu verziju : Pisanje mysql query


bluesman
04. 06. 2007., 12:58
Obično kada pišem querije, pišem svaki deo u novom redu zbog čitljivosti, na primer ovako:

SELECT a.nesto, b.nestoDrugo
FROM tabela1 AS a
LEFT JOIN tabela2 AS b USING (key1)
WHERE nesto
GROUP BY something
ORDER BY ...
LIMIT ...

Međutim imao sam jedan čudan problem. Jedan query mi nije radio, odnosno vraćao mi je empty set (nije prijavljivao grešku) iako znam da treba da vrati records. Posle pola sata maltretiranja, debugovanja, pa čak i pisanja alternativnih querija (što je najgore, kada uradim copy-paste u shell - radi kako treba) u nekom očaju sam sve spojio u jedan red i tako je proradilo (?!?!?). Šta je mogao tu da bude problem? Sigurno nije bilo nikakvih specijalnih karaktera na kraju reda.

Blood
04. 06. 2007., 13:23
Negde sam priocitao da nije preporuceno tako pisati querije(mozda bas zbog toga sto se tebi desilo), ne znam, probaj da pre nego sto lupis enter stavis razmak(ne bi trebalo, ali cisto nagadjam).

cvele
04. 06. 2007., 13:26
znas li na koju ti je tabulaciju bio podesen editor ?

ivanhoe
04. 06. 2007., 13:47
jedino mi pada napamet da je imao problem sa windowsovim new line karakterima, nista drugo ne bi smelo da pravi problem... ako ias negde sacuvan original fajla, probaj da ga otvoris iz shella u vi-ju, pa vidi da li se pojavljuje negde ^M unutar querija....

inace, ja uvek tako formatiram querije koji su duzi od jedne linije..

Petar Marić
04. 06. 2007., 14:04
Tja, ako želiš da više nikad nemaš tih problema: odseci sav white-space sa početka i kraja svake linije; nakon čega spoji linije u jednu, ali sa po jednim znakom razmaka.

DBMS-u je svejedno u kakvom mu formatu šalješ upit - ionako mora da ga parsira.

dinke
04. 06. 2007., 15:17
Ja sam ranije imao slicne probleme i od tada pisem querije ovako:


$query = "SELECT a.nesto, b.nestoDrugo ";
$query .="FROM tabela1 AS a ";
$query .="LEFT JOIN tabela2 AS b USING (key1) ";
$query .="WHERE nesto ";
$query .="GROUP BY something ";
$query .="ORDER BY ... ";
$query .="LIMIT ... ";

bluesman
04. 06. 2007., 16:35
Koji smor... ja sam ponekad pisao ovako


$query = "SELECT a.nesto, b.nestoDrugo ".
"FROM tabela1 AS a ".
"LEFT JOIN tabela2 AS b USING (key1) ".
"WHERE nesto ".
"GROUP BY something ".
"ORDER BY ... ".
"LIMIT ... ";



ali mi je to bzzze :) kada promenis, moras da menjas navodnike, tackice,...

dinke
04. 06. 2007., 16:41
Pa j*ga, na kraju, uvek mozes da odradis neki preg_match_replace na tvoj query (tako sto recimo brises sve nealfanumericke karaktere ili ih zamenis obicnim space-ovima).

jablan
04. 06. 2007., 17:07
Ili da overriduješ metodu mysql_query() i da... Ah da, to ne ide... :D

twix
04. 06. 2007., 17:16
Ja svaki query pishem u jednom redu, ma koliko on bio dugacak ;)

Pedja
04. 06. 2007., 17:19
Upite uglavnom pisem u HeidiSQL-u, osim ako nisu bas jednostavni, pa kada tamo odradim posao prebacim u PHP i izlomim po linijama u istoj formi kako je i Bluesman naveo. Radeci tako nisam do sada imao problem da mi upit ne radi zbog nekog nevidljivog karaktera.

Petar Marić
04. 06. 2007., 17:27
@jablan: Nice one :)

zextra
04. 06. 2007., 18:52
Samo jednom sam imao problem sa ^M karakterom na kraju redova (i naravno nije mi bilo jasno zašto query ne radi), međutim to me nije "ubedilo" da pređem na one-linere ili na više redova sa konkatenacijom :D

ivanhoe
04. 06. 2007., 19:42
Samo jednom sam imao problem sa ^M karakterom na kraju redova (i naravno nije mi bilo jasno zašto query ne radi), međutim to me nije "ubedilo" da pređem na one-linere ili na više redova sa konkatenacijom :D

mnogo je jednostavnije da uzmes editor koji ima opciju da snimi Unix file format i stavis to kao default. Zaista nikad nisam imao ni najmanjih problema, a bas sam picajzla oko indentovanja koda

a i FTP u ASCII modu bi trebalo da ispravi \r\n u \n, cini mi se?

degojs
04. 06. 2007., 19:53
A možda da koristi stored procs ako je MySQL 5?

zextra
04. 06. 2007., 20:08
mnogo je jednostavnije da uzmes editor koji ima opciju da snimi Unix file format i stavis to kao default. Zaista nikad nisam imao ni najmanjih problema, a bas sam picajzla oko indentovanja koda

Upravo tako i radim :) Podseti me jednom da ti pošaljem moj .vimrc fajl :P

bluesman
04. 06. 2007., 21:00
Pa pazi, u istj klasi stoje 2 funkcije sa identicno "stilizovanim" querijem. Jedna funkcija radi - druga ne radi. Smislio sam resenje da u DB klasi automatski konvertujem sve u one-line, onda radi bez problema uvek. Nije bas genijalno, ali radi :)

dinke
04. 06. 2007., 21:03
A jesi li barem provalio koji je problematican karakter u pitanju?

bluesman
04. 06. 2007., 21:13
Ne. U tome i jeste problem.

MrSteel
04. 06. 2007., 21:26
je si ga otvorio u hexadecimalnom zapisu ?

bluesman
04. 06. 2007., 21:38
Ne, ja pisem kod u binarnom zapisu :) Ne zezaj :)

MrSteel
04. 06. 2007., 21:48
ma ozbiljan sam
ja sam nekad provaljivao sumnjive karaktere koji se tek vide hexa tekstualnom modu, svaki karakter hexa zapis :D

McKracken
04. 06. 2007., 22:09
Sta? ne pises u binarnom? Pisi kuci za odelo!


Inace, meni se desavalo da ponekad uleti poneko strano telo u vidu nevidljivih karaktera koji se vide samo u hexa.

zextra
04. 06. 2007., 22:25
Svaki normalan editor ima opciju da prikaže non-printing karaktere, pa nema potrebe za kopanjem po hexu :)

dinke
05. 06. 2007., 01:43
Otkud ti ideja da blues koristi normalan editor ;)

(jao sto trolujemo :)

Elem, pretpostavlojam da ti je najlakse da udaris jedan preg_match ili sta vec za neprintabilne karaktere, pa da vidis da li isti uopste postoje, njihovu ascii vrednost i sl.

MorenoArdohain
05. 06. 2007., 01:48
Ma uzmes total commander, F3 i view hex, kakav editor, kakav regexp, kakvi bakraci :)

zextra
05. 06. 2007., 01:57
Ne, ne, rekli smo da nećemo da gledamo u hex :)

Ne znam, kad bi npr. pisao source u svesku (najbolje A5 formata, to odprilike odgovara širini 80 karaktera, baš kao terminal), pa istu skenirao i zatim propustio dobijene slike kroz OCR, sigurno ne bi imao tih problema sa non-printable karakterima... :D

ivanhoe
05. 06. 2007., 07:30
da zaista, a da obrises tih par linija i napises ih ponovo? :D

Pedja
05. 06. 2007., 08:53
A da zamenis tastaturu? Kako uopste usped da ukucas te karaktere a da to nije namerno? :1007:

dinke
05. 06. 2007., 10:09
A da zamenis tastaturu? Kako uopste usped da ukucas te karaktere a da to nije namerno? :1007:
Ma sigurno je kupio nov kompjuter (http://www.microsoft.com/surface/), a nije uspeo da se snadje sa "interfaceom". :1094:

bluesman
05. 06. 2007., 12:53
Peđa, ako si lood nisi slep :) Kojih karaktera? Rekoh da nije bilo nikakvih specijalnih karaktera.
Dinke: će ti polomim te prstiće pa ćeš morati da koristiš taj interface nosom :)