SQL abfage

M

mirist

Hi,
ich schreibe gerade ein CD Katalog Programm für mich und habe da ein problem

eine tabelle sieht z.b. so aus:

CREATE TABLE folders(fid integer, pid integer, diskid integer,name varchar(128), datum varchar(12), zeit varchar(12));

INSERT INTO "folders" VALUES(1, 0, 1, 'Trailers', '22/05/2003', '06:08');
INSERT INTO "folders" VALUES(2, 0, 1, 'directx', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(3, 0, 1, 'support', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(4, 3, 1, 'BattleNet', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(5, 3, 1, 'Images', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(6, 5, 1, 'ClanIcons', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(7, 5, 1, 'Nav', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(8, 3, 1, 'Layout', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(9, 3, 1, 'ReadMe', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(10, 3, 1, 'Support', '22/05/2003', '05:59');
INSERT INTO "folders" VALUES(11, 3, 1, 'WorldEdit', '22/05/2003', '05:59');

Dabei ist pid ist der parent Verzeichniss von dem Ordner (0 ist im root Verzeichniss)

Also ist z.b. im Ordner Support ( pid=0,id=3) befindet sich der Ordner Images(pid=3,id=5)

ich brauche also eine abfrage um sowas zu erhalten:
/directx/
/support/battlenet/
/support/images/nav/
usw....

ist es überhaupt möglich mit einer einzigen abfrage?
oder muss ich es recursiv machen?


thx
 
Hallo mirist,

da Du dynamisch viele Unterverzeichnisse (vor allem in der Verzeichnistiefe interessant) hast, greift hier meines Erachtens nur eine Rekursion, die Du mit "einfachem" SQL meines Erachtens nicht hinbekommst.
Eine Ebene mit der dazugehörigen Unterebene würdest Du über ein JOIN auf die selbe Tabelle ermitteln können, ich wüsste aber nicht, wie das dynamisch gehen könnte.
100 joins auf sich selbst in eine Abfrage zu packen, unter der Inkaufnahme von 'astronomischen' Laufzeiten in der Hoffnung, dass nie eine größere Verzeichnistiefe existieren wird, wäre nicht gerade sehr sinnvoll...
 
Hmm, könnte man nicht einfach alle Verzeichnisse in ein array packen und damit die Sache lösen?
 
So endlich hab ich es geschafft...

auch wenns nicht mehr viel mit sql zu tun hat vielleicht interessiert es jemanden:

std::map<int,std::list<std::pair<int,std::string> > > folders;

void print_tree(std::string str, int n)
{
std::list<std::pair<int,std::string> >::iterator i;
for (i=folders[n].begin();i!=folders[n].end();i++)
{
std::string tmp_str=str+std::string("/")+(*i).second;

c.write("%s\n",tmp_str.c_str());
print_tree(tmp_str,(*i).first);
}

}


void test(void)
{
read=con->executereader("select id, pid, name from folders where folders.diskid=%d;",id);

while (read.read())
{
std::pair<int, std::string> tmp;
tmp.first=read.getint32(0);
tmp.second=read.getstring(2);
folders[read.getint32(1)].push_back(tmp);
}

print_tree("",0);
}
 
Zurück