Autor | Zpráva | ||
---|---|---|---|
JaySee Profil |
#1 · Zasláno: 14. 6. 2012, 16:43:42
Ahoj,
mám script, který vypisuje jídla do denního menu a celý návrh databáze je řešen jako vícejazyčný. Což mi přináší problém, když chci vypsat všechny pokrmy pro daný den v daném jazyce, ale co kdyby se stalo, že někdo nepřeloží daný pokrm do jiného jazyka? Chci proto nastavit, aby se v takovém případě vypsal název anglicky. Pro výpis z databáze používám tento SQL: SELECT pl.nazev AS nazev, pl.popis AS popis, l.lang_desc AS langdesc FROM pokrm AS p LEFT JOIN pokrm_lang AS pl ON p.id = pl.id_pokrm LEFT JOIN lang AS l ON pl.id_lang = l.id WHERE l.lang = '$lang' ; A má představa je, že když nebude záznam v tabulce pokrm_lang existovat, použije se pokrm_lang s id_lang (řekněme 2 - to je angličtina). Lze to udělat nějakou podmínkou uvnitř SQL? Nebo musím ověřovat existenci jazykového překladu před samotným selectem a pak podle toho vypisovat jinou jazykovou mutaci? Nepřipadne mi to jako schůdné řešení, protože chci, aby se v jiném jazyce vypsal třeba jen jeden řádek ze dvaceti. Jestli někdo víte, jak na to, moc díky za náměty jak to řešit. Pokud na to nepřijdete, budu muset být restriktivní a žádat 100% vyplnění všech jazyků. (což by taky dávalo smysl) |
||
Kajman Profil |
Teď si vůbec nejsem jístý tím zazávorkováním, ale možná něco takového
SELECT coalesce(pl.nazev, ple.nazev) AS nazev, coalesce(pl.popis, ple.popis) AS popis, coalesce(l.lang_desc, le.lang_desc) AS langdesc FROM pokrm AS p LEFT JOIN (pokrm_lang AS pl JOIN lang AS l ON pl.id_lang = l.id AND l.lang = '$lang') ON p.id = pl.id_pokrm LEFT JOIN (pokrm_lang AS ple JOIN lang AS le ON ple.id_lang = le.id AND le.lang = 'en') ON p.id = ple.id_pokrm |
||
JaySee Profil |
#3 · Zasláno: 14. 6. 2012, 17:19:57 · Upravil/a: JaySee
Kajman:
Díky za rychlou reakci, je to hodně dobrý, ale asi jsem se trochu špatně vyjádřil a tohle řešení funguje trochu jinak, než je potřeba. Zkoušel jsem to přepsat tak jak by to mělo být, ale dělá mi to ještě větší zvěrstva. Takže pro upřesnění. Tabulky: lang: |id|lang(cs/en/de/...)|lang_desc(čeština, angličtina, němčina)| - jen uchovává jazyky, které web podporuje pokrm: |id|cena|druh|...| - uchovává všechny pokrmy pokrm_lang: |id_pokrm|id_lang|nazev|popis|...| - drží jen jazykové mutace pokrmů (aby nedocházelo k duplicitám záznamů v databázi) Takže jsem zkusel LEFT JOINnout znovu tabulku pokrm_lang a dát ji do coalesce, ale vypisuje mi to pak všechny pokrmy asi 6 krát... Co z toho opravdu potřebuji dostat je jen ten popis a nazev ve správném jazyce. Kajman: Tak to už je asi lepší řešení, mám zatím testovací data, kde mám dva anglické překaldy a tři české. U této poslední varianty se již cyklus provede 3 krát (tedy správně) ale u chybějícího překladu se nepoužije ten defaultní. Zkouším hledat, kde to upravit, aby to šlapalo, ale zatím marně. Kajman: Tak pozor, změna!! To poslední řešení je přesně to co hledám. Chyba je mezi mou židlí a klávesnicí. Zkopíroval jsem to tak jak to bylo a uplně zapomněl na mojí řídící proměnnou $lang_def... Takže se omlouvám za zmatky a velice děkuji. Takhle si představuji dobře fungují více jazyčné řešení. |
||
Časová prodleva: 12 let
|
0