Autor Zpráva
randy
Profil *
Zdravim,

potrebuji pomoc s jazykovymi mutacemi.

mam produkt ktery ma v tabulce produkty udaje jako id, cas zalozeni, datum posledni upravy, status, apod, a ve druhy tabulce svazany pres id produktu mam texty pro jazykovy mutace, tzn nadpis, text, seo adresu...

a nyni mame frontend... jako defaultni jazyk je nastavena treba AJ, pricemz v AJ by mely byt dostupne i vsechny produkty, ale nemusi, nektere muzou mit vyplneny jen jeden jazyk, treba FR... takze mame produkty, ktere jsou jen v AJ, nektere jsou v AJ a NJ, a nektere jsou pouze ve FR. AJ je defaultni jazyk, proto je dulezitejsi nez FR. A ted prijde uzivatel ktery ma jazyk nastaveny treba na DE... a ja potrebuju vybrat vsechny produkty, ale pro ty co maj nemeckou mutaci vybrat nemecky texty, jinak vybrat anglicky texty, a pokud ani ty nejsou, tak jakoukoliv jinou dostupnou mutaci... Ale musi byt vybrany vsechny produkty, ktere maji alespon jednu jazykovou mutaci vyplnenou...

Lze toto resit ciste za pomoci SQL? Pokud ano, jak?

Mockrat diky
Joker
Profil
randy
Bez toho "jakoukoliv jinou dostupnou mutaci" by to šlo třeba takhle:

SELECT ... FROM produkty p LEFT JOIN (SELECT ... FROM texty WHERE jazyk='cz') t
...takže pokud produkt má text v cz, vrátí to text, pokud ne, tak NULL. No a kde text bude NULL by se napsalo něco jako "Popis produktu není dostupný ve zvoleném jazyce"

Dál mě napadá "prasečí" řešení takovéto:
SELECT ... FROM produkty p LEFT JOIN (SELECT ... FROM texty WHERE jazyk='cz') cz ON (p.id=cz.id) LEFT JOIN (SELECT ... FROM texty WHERE jazyk='en') en ON p.id=en.id ...
...no a pak zkusit text vytáhnout z cz.sloupec, když tam nebude, tak z en.sloupec a tak dále.
Ale tohle řešení je dost humus, teda. Možná pokud by se vždycky vybíralo třeba jen ze dvou variant (tj. třeba český popisek a když nebude, tak anglický a když nebude ani ten, tak to vzdát a vypsat nějakou obecnou hlášku, i když bude třeba německý popisek), dalo by se o tom uvažovat.

Dál v případě, že drtivá většina položek bude mít popisky v drtivé většině jazyků (tj. že by nějaká položka v daném jazyce neměla popisek bude spíš výjimečná událost), dalo by se prostě vybrat všechny popisky pro daný jazyk a u položky, kde popisek není, udělat něco jako
SELECT ... FROM texty WHERE id_polozky = $id ORDER BY (jazyk='en') DESC, jazyk LIMIT 1
...a vzít to, co to najde, jestli to něco najde.
Nevýhoda je zřejmá- dotaz navíc pro každou položku, pro kterou v daném jazyce není popisek.

Nic dalšího mě zatím nenapadá, ale možná jsem na své myšlenkové cestě minul nějaké snadné a jednoduché řešení :-)
ninja
Profil
Dalsi prasecinka:

SELECT CASE WHEN t_cs.nazev IS NOT NULL THEN t_cs.nazev WHEN t_fr.nazev IS NOT NULL ELSE t_fr.nazev END AS nazev FROM produkty p LEFT JOIN texty t_cs ON p.id = t_cs.produkt_id AND t_cs.jazyk = 'cs' LEFT JOIN texty t_en ON p.id = t_en.produkt_id AND t_en.jazyk = 'en' ...


Ale doufam ze se prijde Kajman_ a ukaze rozumne reseni.
Kajman_
Profil *
Možná něco jako

select * from mutace where jazyk='DE'
union all
select * from mutace where jazyk='AJ' and id_produktu not in (select id_produktu from mutace where jazyk='DE')
union all
(select * from mutace where id_produktu not in (select id_produktu from mutace where jazyk in ('AJ','DE'))  group by id_produktu)
randy
Profil *
Vyborne, vsechno vyzkousim.

Vsem mockrat diky!

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: