Autor Zpráva
Tomas11
Profil *
Dobry den,

chcel by som sa spytat,. ak prosim Vas spravim nasledovny SELECT?
mam tabulku povedzme uzivatelia:
id, meno
1, janko
2, marienka
3, mirka

a druhu tabulku napriklad stavy:
id1, id2, status
1, 2, manzelia
1, 3, surodenci

potreboval by som spravit select, ktory by mi vratil vsetky stavy, kde je janko:
janko - marienka = manzelia,
janko - mirka = surodenci

napada Vas nejake riesenie takehoto zlucenia tabuliek? Skusam pouzit INNER JOIN,

SELECT uzivatelia.meno, stavy.status FROM uzivatelia INNER JOIN status WHERE (uzivatelia.id = stavy.id1 OR uzivatelia.id = stavy.id2) 


vzdy mi to ale vrati len jedno meno.. janko = manzelia,.. :(
vdaka za kazdu radu!
sysel
Profil
Jednak relace příbuznosti není obousměrná tedy tabulka stavů musí obsahovat řádky
1,2,manzel
2,1,manzelka
1,3,brat
3,1,sestra
druhak je třeba pospojovat tabulky tři:

SELECT u.meno, v.meno, s.status
FROM test.stav as s, test.uzivatelia as u, test.uzivatelia as v 
WHERE 1
and u.id = s.id1 
and v.id = s.id2


Zkuste si tabulky doplnit záznamy typu mať/syn ujo/neter ktoré sú celkom viditelne nesymetrické.
sysel
Profil
Možno by to zobrazilo zrozumitelnejší výpis ak by sa SQL dotaz preformuloval takto:
SELECT u.meno,  ' je ', s.status,  ' uživatelia ', v.meno
FROM test.stav AS s, test.uzivatelia AS u, test.uzivatelia AS v
WHERE 1 
AND u.id = s.id
AND v.id = s.id2

...
janko je manzel uživatelia marienka
janko je brat uživatelia mirka
miro je ujo uživatelia marienka
Tomas11
Profil *
Dakuejm skusim teda s tou tretou tabulkou.

ako ale funguje napriklad taka klasicka posta uzivatelov na nejakom diskusnom webe? Predpokladam, ze tam su tiez 2 tabulky.
uzivatelia, a posta

uzivatelia maju nejake id, a meno
a posta, id_odosielatiel, id_adresat, posta, datum....

a vystup je Janko -> Marienka, text_posty

no nic, skusim sa s tym este pohrat, dakujem
sysel
Profil
Nie tri rôzné tabuľky - ak chcem z jednej tabulky rôzne stĺpky s podmienkou, musím si ju do zoznamu FROM dať dva razy. Ak pospájam iba tabulky uzivatelia a stav, môžem sa dozvedieť iba, že Janko je mánžel, ale nebudem vedieť koho.
Eště poznámka - v MySQL je spojenie tabuliek cez directivu JOIN rovnocenné rozšíreniu zoznamu FROM s konjunciou podmienky pre spojenie. Niektrorí autori uvádzajú, že to s JOINom trvá dokonce dlhšie, ale to si nemyslím, lebo pdla informácií z webu MySQL, si to engine dátabázy vnútorne preskladá a urobí to po svojom.
Iba v prípadě zcela rovnocenných vťahou typu kamarát netreba vkladať symetrické záznamy, ale prehladávní tabulky bude složitejšie, lebo ak si v tom pôvodnom príklade budem chcieť dohľadať mánželstvo iba pre Marienku, budem hľadať podla id2 v tabulke stavov, čo pre Janka robím cez id1.
Príklad s mailami je celkom iste nesymetrický, čo je vidno aj z pomenúvanie id. Ále zostáva problém - dotaz
SELECT u.meno, u.id, p.id_odosielatiel, id_adresat 
FROM uzivatelia as u, posta as p
WHERE u.id = p.id_odosielatiel
získame informaciu, že Janko písal uzivatelovi, ktorý má id_adresat rovnaké ako je id Marienky v tabulke uzivatelia. Ále ak chceme získat aj informáciu, aké je meno tohto uživatelia, musíme urobiť ďalší nezávislý dotaz do tabulky uzivatelia. A to je význam pospájanie tej istej tabulky akoby sama zo sebou.

Ak si urobím iba jednu tabulku divizia
id, id_nadriadeneho, meno, funkcia
1, null, Karpany, velitel divizie
2, 1, Preichovec , velitel prveho pluku
3, 2, Konrad, velitel prveho práporu
4, 1, Holous, velitel druheho pluku
5, 1, Mikloško, velitel divíznej spojovacej roty
6, 5, Gyňa, velitel čaty radistov
...
234, 12, Dežo, kuchár

je jasne, že dotaz
SELECT p.meno, p.meno FROM divizia as p WHERE id = id_nadriadeneho 

je nesmysel, ále
SELECT p.meno, ' je nadriadený vojakovi: ', q.meno 
FROM divizia as p, divizia as q 
WHERE p.id = q.id_nadriadeneho 

vypíše správné vzťahy.

Premyslieť, naštudovať, nazkúšať :-)

Poznámka: v MySQL s použitím engine MyISAM není jiné volby. V PostgreSQL popřípadě v MySQL s použitím engine INODB je možné využít relací, ale to je trochu jiná káva.

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