Autor Zpráva
Anonymní
Profil *
Dobry den. Som zaciatocnik v MySQL, potreboval by som radu. Zistil som z dokumentacie ze trigger sa da volat na akcie ON UPDATE a ON DELETE. Ja by som potreboval nieco podobne - s tym ze by to malo fungovat tak ze ked pouzijem SELECT na dany stlpec (SELECT stlpec) na tom stlpci bude nastavene podobne volanie, udalost ON SELECT ktora bude volat idealne proceduru ktorej ako parameter preda hodnotu konkretnej bunky v stlpci, ktoru ubde aktualne spracovavat.. :D no ked tak na to pozeram zda sa mi to trosku utopisticke a asi chcem od strukturovaneho dotazovacie jazyka a opensource MySQL vela.. no neviem ono teoreticky by to asi slo ale mysql na podobne veci zrejme nema kontrolne mechanizmy. Mozno sa zda ze sa snazim az privelmi preniest aplikacnu logiku na databazu, ale usetri mi to zas pisanie nejakej funkcie v PHP, a hlavne to usetri dotazy na databazu. A vlastne riesil som ten problem a len tak ma napadlo ci sa nieco podobne da :) Tak ked mate niekto nejaky napad, budem vdacny za kazdy myslienku.
Leo
Profil
K čemu by měla procedura na SELECT (kdy se nemění stav db) sloužit? Leo
Anonymní
Profil *
Chcel som proste robit preklady pre rozne jazyky priamo v databaze. Vyriesil som to takto:
$query = <<< EOF
SELECT rsh_preklady_typsnehu.$jazyk     AS typsnehu, 
       rsh_preklady_pocasie.$jazyk   AS pocasie,
       rsh_preklady_podmienky.$jazyk AS podmienky,
FROM rsh_lyzovanie
     JOIN
     rsh_preklady_typsnehu     ON rsh_preklady_typsnehu.svk = rsh_lyzovanie.typsnehu 
     JOIN
     rsh_preklady_pocasie   ON rsh_preklady_pocasie.svk = rsh_lyzovanie.pocasie
     JOIN
     rsh_preklady_podmienky ON rsh_preklady_podmienky.svk = rsh_lyzovanie.podmienky       
WHERE rsh_lyzovanie.id = $enum_miesto[$miesto];
EOF;

je to super, akurat to ma taku nevyhodu ze pre kazdy prekladany stlpec musim robit novu tabulku ktora vlastne identicka s tymi ostatnymi prekladovimi, co je myslim proti dobrym zasadam relacnych databaz. Tak som tabulky spojil. Kedze je to slovnik, dalsi riadok ako identifikator prekladaneho stlpca nepotrebujem, slovicka sa budu prekladat vsade rovnako. No a teraz ako poskladat nejaky mudry dotaz.
$query = <<< EOF
SELECT rsh_preklady.$jazyk AS preklad 
FROM rsh_lyzovanie, rsh_preklady
WHERE rsh_lyzovanie.id = $enum_miesto[$miesto]
      AND
      (
       rsh_preklady.svk = rsh_lyzovanie.typsnehu
       OR
       rsh_preklady.svk = rsh_lyzovanie.pocasie
       OR
       rsh_preklady.svk = rsh_lyzovanie.podmienky
      );
EOF;

Funguje, akurat to vracia tri riadky (v zahadnom poradi) takze to musim este v PHP spracovat, a tiez treba este jeden dotaz na vytiahnutie ostatnych udajov z tabulky rsh_lyzovaniem, lebo ked to narvem tu tak mi to vytiahne tri krat to iste.
Tak som myslel ze by sa volala pri kazdom selecte na pocasie, podmienky a typ snehu specificka procedura a ty by obsahovala nieco ako napr. pre pocasie po anglicky:
SELECT rsh_preklady.@jazyk AS preklad 
FROM rsh_preklady
WHERE rsh_preklady.svk = @predany_parameter_obsah;

V kazdom pripade, ked mate niekto skusenosti s navrhom podobnych prekladovych slovnikov v databaze, bol by som velmi rad keby ste mi poskytli nejake dobre rady. Dakujem.
Joker
Profil
Anonymní:
Nějak se v tom ztrácím, můžete popsat jaké sloupce ta tabulka má a případně k čemu jsou?

Já bych asi tabulku sloužící jako "slovník" udělal nějak takhle:
ID | jazyk | text
...a data například: 1 | "cz" | "Ahoj", 2 | "en" | "Hello"

případně:
ID | zdroj | jazyk | text
...a data například 1 "txt_pozdrav" | "cz" | "Ahoj", 2 | "txt_pozdrav" | "en" | "Hello"
Anonymní
Profil *
Super, tak ako vravite je presne ako som si to predstavoal. Ten druhy sposob. Ale teraz moj problem - ako poskladat SELECT ktory mi vrati vsetky polozky s tabulky ZDROJE ktore chcem prekladat (zdroj1 a zdroj2) prelozene podla slovnika?? ja to zvladam pospajat len tak ze sa mi prelozi jedno.. ked budem chciet prelozit viac tak sa mi to opet vrati vo forme tolkych riadkov kolko vyrazov prekladam.. ja chcem len jeden riadok.

zdroje
ID | nejaka_info1 | zdroj1 | zdroj2 | nejaka_info2
...a data například 1 | "nepodstatne" | "text_na_preklad_zo_zdroja_1" | "text_na_preklad_zo_zdroja_2" | "nepodstatne" ,
                              2 | "nepodstatne" | "text_na_preklad_zo_zdroja_1" | "text_na_preklad_zo_zdroja_2" | "nepodstatne" 


slovnik:
ID | zdroj | jazyk | text 
...a data například 1 "txt_pozdrav" | "cz" | "Ahoj", 2 | "txt_pozdrav" | "en" | "Hello"


kod pre prelozenie jedneho vyrazu:
SELECT zdroje.*,
       slovnik.text AS preklad_jedneho_zdroja
FROM   zdroje,
       slovnik
WHERE  zdroje.id = 1
       AND
       zdroje.zdroj1 = slovnik.zdroj
       AND slovnik.jazyk = 'en';


vrati vsetky polozky tabulky zdroje s ID 1 (teda jeden riadok) + policko `preklad` s anglickym prekladom zdroja1. chcel by som aby mi vratilo este napr. `preklad2` s anglickym prekladom zdroja2. Ked to upravim takto:

SELECT zdroje.*,
       slovnik.text AS preklad_jedneho_zdroja
FROM   zdroje,
       slovnik
WHERE  zdroje.id = 1
       AND
       (
        zdroje.zdroj1 = slovnik.zdroj
        OR
        zdroje.zdroj2 = slovnik.zdroj
       )
       AND slovnik.jazyk = 'en';


vrati mi to tri riadky. Takze by som chcel (ked sa to da) ako to zahrnut do jedneho selectu, aby mi to vratilo jeden riadok s dvoma prelozenymi hodnotami.
Kajman_
Profil *
Připojte si dvakrát tu samou tabulku...

select z.*,
s1.text AS preklad_jedneho_zdroja,
s2.text AS preklad_druheho_zdroja
from zdroje z
left join slovnik s1 on z.zdroj1=s1.zdroj and s1.jazyk='en'
left join slovnik s2 on z.zdroj2=s2.zdroj and s2.jazyk='en'
where z.id=1
Anonymní
Profil *
Jej dakujem, super :) Nieco podobne som skusal akurat som nevedel ze sa tam daju dat aliasy za joiny, takze som nevedel ako tie vysledky identifikovat, tak som to zavrhol. Ale nemalo by to funovat aj bez toho left? Mozem este vediet preco si myslite ze by to tam malo byt? Dakujem.
Kajman_
Profil *
Aby byly ve výsledky i ty řádky, kde se nějaký zdroj nepodařilo najít - třeba nebyl nastaven.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0