mysql_query "hierarchikus" lekérdezés
Üdv!
A cím, lehet hogy nem pontos, de egy érdekes problémába ütköztem. A probléma lényege az lenne, hogy adott 2 adattábla, amit egy segédtáblával szeretnék összekötni. A segédtáblában, csak az első és a másik táblában tárolt sorok ID-je található. Röviden egy sorhoz több sort rendelnék a másik táblából.
Az első táblában mondjuk, foci csapatok vannak, a másodikban, pedig játékosok, a segédtábla pedig tartalmazza, hogy melyik csapathoz melyik játékosok tartoznak. (ez csak egy példa)
Szeretném megoldani, hogy egy mysql_query lekérdezéssel lekérem a csapatokat, és a csapatokhoz tartozó tartozó játékosokat.
Egyféle megoldást ismerek, ami a következő:Ez eddig szép és jó, de ha egy lekérdezésben kérném le, akár JOIN-nal, vagy ahogy az előbbi példában, akkor a csapat adatait annyiszor kéri le, ahány játékos van. A kérdésem pedig az lenne, hogy ilyesfajta problémákat meg lehet-e úgy oldani, hogy mondjuk egy GROUP BY - al csapatID szerint csoportosítom, de a csapathoz tartozó játékosok a csapat "alá rendelve" megmaradjanak? ( mondjuk egy több dimenziós tömbben )
Mondjuk ez elég hülye példa, de vannak bizonyos esetek, ahol jól jönne erre valami elegánsabb megoldás.
A válaszokat előre is köszi!
■ A cím, lehet hogy nem pontos, de egy érdekes problémába ütköztem. A probléma lényege az lenne, hogy adott 2 adattábla, amit egy segédtáblával szeretnék összekötni. A segédtáblában, csak az első és a másik táblában tárolt sorok ID-je található. Röviden egy sorhoz több sort rendelnék a másik táblából.
Az első táblában mondjuk, foci csapatok vannak, a másodikban, pedig játékosok, a segédtábla pedig tartalmazza, hogy melyik csapathoz melyik játékosok tartoznak. (ez csak egy példa)
Szeretném megoldani, hogy egy mysql_query lekérdezéssel lekérem a csapatokat, és a csapatokhoz tartozó tartozó játékosokat.
Egyféle megoldást ismerek, ami a következő:
$csapatok = mysql_query( "SELECT * FROM csapatok" );
while( $csapat = mysql_fetch_object( $csapatok ) ){
echo $csapat->csapatNeve."<br/>";
$jatekosok = mysql_query(
"SELECT * FROM segedtabla,jatekosok
WHERE segedtabla.csapatID = $csapat->csapatID
AND segedtabla.jatekosID = jatekosok.jatekosID"
);
while( $jatekos = mysql_fetch_object( $jatekosok ) ){
echo "--".$jatekos->jatekosNeve."<br/>";
}
}
Mondjuk ez elég hülye példa, de vannak bizonyos esetek, ahol jól jönne erre valami elegánsabb megoldás.
A válaszokat előre is köszi!
Szerintem így nem
Én ezt egy queryvel, LEFT JOIN-nal csinálnám meg (GROUP BY nélkül), és a while ciklusban figyelnék rá, hogy még ugyanabban a csapatban vagyunk-e, vagy már a következő jön.
plusz order by
A lekéréssel nincs baj végülis...
A fenti megoldás viszont egy nagyobb terhelésnél marha lassú lehet... Főleg ha mondjuk egy több szintű, 1 a többhöz lekérdezést végzünk, jó sok elemmel, pl egy többszintű dropdown menü előállításához, amit minden oldalon ki kell rajzolni.
Mert ahogy tapasztaltam, ha sok a mysql_query hívás, nagyon lelassíthatja az oldalt... Sokkal jobban, mintha csak 1 mysql_query lenne, és utána a lekért adatokkal operálnánk.
Szerk1.: Azthiszem pontosítva a dolgot, egy 1:n - hez szerkezetből kellene lekérni az adatokat, egy lekérdezéssel.
Valamit félreértesz. A
Egyébként nem is 1:n a
Ha viszont tényleg 1:n a kapcsolat (pl egy adott nemzeti bajnokság csapatai és az ott szereplő játékosok), akkor itt adatbázisszervezési gondok vannak, mert ez esetben a segedtabla-ra nincs is szükséged. A jatekosok táblában tartsd nyilván a játékoshoz tartozó csapatot ID szerint. Így csak két táblát join-olsz, és a lekérdezés is gyorsabb. A segédtábla pont az n:m kapcsolatok leírására szolgál.
Ja és ne feldkezz meg az indexelésről. A csapatok.csapatID és a jatekosok.jatekosID elsődleges kulcs, és az order by miatt a jatekosok.jatekosNeve -re is tegyél egy indexet. Így még gyorsabb lesz a query.
join
Igaz is...
Amúgy adatbázis szervezési gondok lehetnek, mert ezt a példát csak a bejegyzés írása közben találtam ki. Egy általános megoldásra voltam kíváncsi 1:n és n:m szerkezet lekérésére, amit meg is kaptam, szóval köszi!