[ s4djan @ 17.02.2011. 20:12 ] @
Uzeo sam u poslednje vreme da vezbam malo "komplikovanije" (za mene) join upite u mysql-y. Postavio sam sebi logican model i krenuo da postavljam probleme i iste resavam. Na pocetku je sve islo kako treba ali sam naisao na sledeci problem:

Imam tri tabele:

categories(id, parent_id),
categories_languages(category_id, language_id, name, description)
languages(id, name)


Cilj:
Zelim da izlistam sve kategorije sa svojim parent kategorijama (ogranicio sam se na tri nivoa) odnosno njihova njihova id i name polja za odredjeni jezik.

Ja sam uradio sledece (ispise mi samo id-eve):

Code:

SELECT t1.id, t2.id, t3.id
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories AS t3 ON t3.parent_id = t2.id


to je jednostavan deo posla jer kada dodam ovo,

Code:

LEFT JOIN categories_languages AS cl1 ON cl1.category_id = t1.id
LEFT JOIN categories_languages AS cl2 ON cl2.category_id = t2.id
LEFT JOIN categories_languages AS cl3 ON cl3.category_id = t3.id
WHERE cl1.language_id = 1
AND cl2.language_id = 1
AND cl3.language_id = 1


eliminise mi sve redove gde je id null.

Ja dalje ne znam, ne mogu da mrdnem svasta sam citao ova dva dana ali nisam naisao na onaj klik koji ce mi resiti ovo, pa zato vas molim da mi pomognete.
[ biske86 @ 17.02.2011. 20:42 ] @
WHERE služi za eliminaciju redova. Znači ti si stavio da ti vraća samo redove kod kojih su id ove tri tabele jednaki 1. Isto tako ako hoćeš da ti pored ovih redova vraća i redove kod kojih je id NULL onda to moraš da staviš u WHERE klauzuli. Na primer dodaš u tvoj kod:

Code (sql):
SELECT t1.id, t2.id, t3.id
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories AS t3 ON t3.parent_id = t2.id
WHERE cl1.language_id = 1
AND cl2.language_id = 1
AND cl3.language_id = 1
AND cl1.language_id IS NULL
AND cl2.language_id IS NULL
AND cl3.language_id IS NULL



[ s4djan @ 18.02.2011. 06:38 ] @
"biske86" hvala sto si se javio ali moram da kazem da je u igri je jos jedna tabela "categories_languages" nju si izostavio jer samo iz nje mogu da izvucem imena na odredjenom jeziku.

Gore sam samo iskomplikovao pa evo opet da prikazem kompletan moj upit:

Code (sql):

SELECT
t1.id AS lev1,
t2.id AS lev2,
t3.id AS lev3,
cl1.name AS lev1_name,
cl2.name AS lev2_name,
cl3.name AS lev3_name
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories AS t3 ON t3.parent_id = t2.id
LEFT JOIN categories_languages AS cl1 ON cl1.category_id = t1.id
LEFT JOIN categories_languages AS cl2 ON cl2.category_id = t2.id
LEFT JOIN categories_languages AS cl3 ON cl3.category_id = t3.id
WHERE cl1.language_id = 1
AND cl2.language_id = 1
AND cl3.language_id = 1
 


on vraca samo redove koji imaju sva tri nivoa sve ostale koji imaju dva lil samo jedan ukloni.

Logika ovakve organizacije tabela u bazi jeste u tome da imam posebnu tabelu (categories_languages) za delove entiteta kategorija koje potrebno prevesti (name, desciption) pa stoga ta tabela ima category_id koji upucuje na koju kategoriju se sadrzaj odnosi i language_id koji upucuje na koji jezik se taj sadrzaj odnosi.
Logicki mi je to izgledalo ok ali ne znam da napisem ovaj upit jer citava situacija mi se zakomplikovala sa self-join.



Evo i baze sa tabelama:
[ s4djan @ 18.02.2011. 19:21 ] @
Uspeo sam :

Code (sql):

SELECT
t1.id AS lev1, t2.id AS lev2, t3.id AS lev3,
cl1.name AS lev1_name,cl2.name AS lev2_name, cl3.name AS lev3_name
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories AS t3 ON t3.parent_id = t2.id
LEFT JOIN categories_languages AS cl1 ON cl1.category_id = t1.id AND cl1.language_id = (SELECT id FROM languages WHERE name = 'eng')
LEFT JOIN categories_languages AS cl2 ON cl2.category_id = t2.id AND cl2.language_id = cl1.language_id
LEFT JOIN categories_languages AS cl3 ON cl3.category_id = t3.id AND cl3.language_id = cl2.language_id
 


Samo jos jedno pitanje:
Da li po vasem misljenju ovakva organizacija tabela odnosno entiteta je pogodna za visejezicno strukturisanje modela, ili ima neki bolji nacin?