Lekérdezési sorrend mysql-ben.


 Sziasztok!
Van egy kategória táblám, szerkezete (vagyis csak két oszlopét mutatom)
ID | SzuloID
--------------
1 | 0
2 | 0
3 | 1
4 | 1
5 | 2
6 | 5
7 | 1
8 | 5
9 | 2
10 | 0
... stb.
Ahol a SzuloID=0 azok a fő kategóriák, ahol nem nulla, ott azt mutatja, hogy az adott kategória melyik kategória alá tartozik.
Úgy szeretném lekérni az adatokat, hogy a kategóriákat a megfelelő sorrendbe mutassa:
azaz a legkisebb ID-jű főkategória legyen legelől, utána azok az alkategóriák amelyek ő alá tartoznak.
Tovább nem csak egy szint van, az alkategóriáknak lehetnek további alkategóriái is.
Nem tudtam rájönni a SQL utasításra, ezért kérném a segítségeteket.
Segítségképp mutatom, hogy milyen sorrendben szeretném megkapni az adatokat.
ID | SzuloID
--------------
1 | 0 Főkategória
3 | 1 Alkategória - 1 ID-jű főkategória után
4 | 1 Alkategória - 1 ID-jű főkategória után
7 | 1 Alkategória - 1 ID-jű főkategória után
2 | 0 Főkategória
5 | 2 Alkategória - 2 ID-jű főkategória után
6 | 5 Alkategória - 5 ID-jű alkategória után
8 | 5 Alkategória - 5 ID-jű alkategória után
9 | 2 Alkategória - 2 ID-jű főkategória után
10 | 0 Főkategória
stb ..
A segítséget előre is köszönöm! |
| Vagy veszel fel +1 mezőt, hogy mi a sorrend és akkor order by, vagy pedig egy rekurzív eljárással bejárod a táblát tárolt eljárással vagy egy valamilyen programnyelvvel. |
Azaz nincs olyan SQL parancs, amellyel a kívánt formában le lehet kérni az adatokat?!
Egy plusz sorszám mezőt azért nem szeretnék, mert akkor amikor beszúrok valahová egy kategóriát, akkor a sorszám meghatározás lesz macerás. |
| Kapcsold talán a táblát önmagához a kulcsoknak megfelelően.. |
MySQL-ben nincs.
Viszont itt nézelődhetsz. |
<? $adat_lek = mysql_query("SELECT DISTINCT ID,SzuloID FROM tabla ORDER BY ID + 0"); while ($adatok[] = mysql_fetch_assoc($adat_lek));
function lek($darab,$ID){ $i=0; $adat=$GLOBALS["adatok"]; while($i < $oldal_darab){ print $adat[$i]["ID"]; if($ID == $adat[$i]["SzuloID"]){ lek($darab,$adat[$i]["ID"]); } } $i++; }
$darab = count($adatok)-1; lek($darab,0); ?>
|
| IGen, azt tudom, hogy PHP-ben miként lehet rendezni ... de nekem fontos lenne, hogy már lekérdezésben megkapjam a helyes eredményt .... ugyanis itt több listázási oldalt (akár 30 különbözőt is, vagy ég többet) ugyanaz PHP kódsor dolgoz fel ... az SQl lekérdezést paraméterként kapja a php kódsor, és a kódsorba nem tudok plusz funkciókat bevinni. Ez így zavaros lehet, a lényeg, hogy PHP kikerülése szükséges lenne. |
Ami neked kell, azt rekurzív folyamattal lehet csak megoldani, és tudtommal ilyen nincs a mysql-ben.
ha fix mélységű lenne a szerkezet, akkor inner join-okkal meg lehetne oldani, de végtelenített esetben nem tudsz végtelenített kódot létrehozni. |
| select id, szuloid from tabla order by if(szuloid=0,cast(concat(id,szuloid) as unsigned),cast(concat(szuloid,id) as unsigned)) |
Ez a lekérdezés nekem nem vált be ... nem a kívánt sorrendet adta vissza, sajna ... :(.
Egyébként értem a logikádat, de ez csak speciális helyzetekben rendezi a kategóriákat megfelelően, és akkor, ha a kategóriákat és alkategóriákat egymás után veszi fel az ember. |
Kis kieg, hogy sok-sok fő/al menünél jó legyen:
select id, szuloid from tabla order by if(szuloid=0,cast(concat(id,szuloid) as unsigned)*1000,cast(concat(szuloid,lpad(id,4,0)) as unsigned)) |
Az előbbinek és a mostaninak is csak az a baja, hogy csak 2-szintű rétegződésnél működik jól, ha már mondjuk 3-szintű a kategória felsorolás, akkor már nem megy ...
Igen, egyébként gyanítom most már én is, hogy csak rekurzióval lehet megoldani ... itt a Prog.hu-n is találtam már hasonló témát, és ott adtak is linket (meg itt is Hack), de egyáltalán nem értettem amit ott írtak! :) Egyébként a cím:
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html |
| Akkor nem volt véletlen, hogy ismerős volt a kérdés! Akkor viszont ez duplikált téma, az előzőt kéne folytatni, ezt meg lezárni! Miért teszed fel 2x ugyanezt a kérdést? |
itt a Prog.hu-n is találtam már hasonló témát
Én valószínűbbnek tartom, hogy nem topic-ot hozott létre, hanem keresett, de nem talált választ, csak linket, amin nem tud eligazodni. |
Igaz. gyakorlatilag ugyanezt kérdezték meg itt, ezért tűnt ismerősnek a dolog.
És ott még ezt találta jónak a kérdező. |
| Akkor mégegyszer: az én kérdésem arra vonatkozott, hogy egy SQL lekérdezéssel lekérdezhető-e a Fa szerkezet - nincs segédmező, nincs segédtábla, nincs php, csak egyetlen egy lekérdezés - korábban írtam, hogy a listázást végző PHP script (amit nem látok) az SQL lekérést paraméterben kapja meg, és a lekérdezésben visszakapott eredmény fogja listázni. |
| MySQL-ben most nincs ilyen. |
Ha tudod, hogy maximum hány szintről van szó, akkor megteheted, hogy a táblát annyiszor (left/rigth join)-al hozzákapcsolod saját magához
Így minden egyes tételnél meglesz az összes felette lévő (szuloID) azonosító.
Ez után már rendezheted a szuloID-k alapján a legfelső szint, az alatta lévő, az alatta lévő, .... szerint.
|
|