Autor | Zpráva | ||
---|---|---|---|
Tomas11 Profil * |
#1 · Zasláno: 20. 3. 2010, 22:20:20
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 |
#2 · Zasláno: 21. 3. 2010, 04:36:35
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 |
#3 · Zasláno: 21. 3. 2010, 04:56:57
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 * |
#4 · Zasláno: 21. 3. 2010, 09:07:13
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 |
#5 · Zasláno: 21. 3. 2010, 11:39:25 · Upravil/a: sysel
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 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. |
||
Časová prodleva: 14 let
|
0