Autor | Zpráva | ||
---|---|---|---|
final Profil |
#1 · Zasláno: 12. 6. 2013, 18:14:16
zdravím,
potreboval by som pridať nejak podmienku do tohoto $premenna = 1; $result = dibi::query(" select jedna, dva from tabulka where stlpec=( if (jedna='$premenna'){ dva } else{ jedna } ) "); ďakujem |
||
Kcko Profil |
#2 · Zasláno: 12. 6. 2013, 18:16:14
final:
Podívej se do examples které jsou součastí dibi, lze to, přímo v SQL |
||
Camo Profil |
#3 · Zasláno: 12. 6. 2013, 19:27:04
final:
Na toto použi funkciu if() Inak by ma zaujímalo, či sa to dá napísať cez if then else v tej where podmienke. Mne to teda nešlo.... |
||
Tori Profil |
#4 · Zasláno: 12. 6. 2013, 22:14:23
Pokud všechny výskyty jedna, resp. dva označují tentýž sloupec (tj. aliasy místo skutečného názvu sloupce), pak se to přeci dá zapsat obyčejnou podmínkou:
SELECT sloupce FROM tabulka WHERE jedna = '$promenna' AND sloupec = dva OR sloupec = jedna |
||
Camo Profil |
#5 · Zasláno: 13. 6. 2013, 09:41:51
Tori:
To je čistá práca, treba uznať, ale s tou if funkciou sa to lepšie číta: select jedna, dva, tri from tb where tri = if(tri=x, dva, jedna); |
||
Tori Profil |
#6 · Zasláno: 13. 6. 2013, 10:24:08
Camo:
A nezkoušel jste, jaké by na tom bylo využití indexů? Docela by mě to zajímalo, jak si s tím IF MySQL poradí.
|
||
Tori Profil |
Tak jsem to zkoušela na vzorku 4500 řádků, tři sloupce náhodných čísel v rozmezí 0-2000, podmínce vyhovují 4 řádky. Při dotazu podle [#4] explain píše, že by se mohly použít některé indexy (jedna+sloupec+dva nebo jedna+sloupec), ale nepoužily se. U verze podle [#5] indexy možné nenavrhuje, nicméně tento dotaz byl o zlomek rychlejší (největší rozdíl krajních hodnot asi 1.5ms).
Nicméně přišla jsem na to, že ty dva zápisy nejsou ekvivalentní: Dotaz s podmínkou podle [#1] nenajde řádky, kde tri == jedna && jedna = '$promenna' . Aby byly ekviv., musela by se podmínka otočit: select jedna, dva, tri from tb where if (tri = dva, jedna = '$promenna', tri = jedna) - ale co do čitelnosti nic moc. Explain ani rychlost se tím nemění.
edit: Z těch méně čitelných způsobů se totéž dá napsat i takto, ale je to z těch tří možností nejpomalejší: select jedna, dva, tri from tb where (tri, jedna) in ((tri, tri), (dva, '$promenna')) |
||
Camo Profil |
Tori:
No pomýlil som sa tam. Miesto tri má byť v podmienke jedna: select jedna, dva, tri from tb where tri = if(jedna=x, dva, jedna); |
||
final Profil |
#9 · Zasláno: 15. 6. 2013, 10:39:49
ďakujem všetkým :)
|
||
Časová prodleva: 11 let
|
0