Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
?HTML-ben a Flash átméretezés torzul
Eredeti mezőnevek lekérdezése
?Input mezőből visszakapott adat probléma
Oldalon keresés 8x írja ki az eredményt
?XML-ből sok szövegmező
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

Lekérdezési sorrend mysql-ben.

»

Lekérdezési sorrend mysql-ben.

nyitotta: fferlen, idő: 2010.03.10., moderátor: Árnyék
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Adatbázisok » MySQL

Sorrend:
Időzóna:
Blokkméret:
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.

Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Hack100
»Riha60
»Akhiles50
»mrchandra50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen