Vollständige Version anzeigen : Sql schleife, subselect oder join oder doch was anderes?


Decryptor
21.12.2014, 01:48

Hallo,
ich habe im moment ein kleines Problem was doch etwas über meine Vorstellungskraft geht.

ich habe eine DB die so aufgebaut ist
;picload~org/image/clcagpp/subsub;jpg


jedes Forum egal ob Main oder Sub hat eine eindeutige ID, und parent ID,
die parent Id wenn Sie nicht 0 ist enthält die Id des über geordneten und dies setzt sich soweit fort bis zu einer bestimmten ID 14 als bsp bei der soll es nichtmehr weiter gehen.

Ich bräuchte nun eine Ausgabe die die Ursprungsid enthält aber alle Namen der jeweiligen Namen


also als bsp

6 -> Haupt->Hauprsub_a->Sub_a->Subsub

hatte das ganze per php rekrusiv per Schleife die ich irgendwan abgebrochen hab machen lassen dies ist aber nicht die beste lössung zumal unflexibel wenn sich irgend etwas ändert also muss ne sql lössung her, ich nutzte mysql, ich habe aber hierbei irgendwie keinen plan

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
raid-rush
21.12.2014, 12:13

ich würde einen query machen und einfach die relativ kleine datenmenge in ein array laden und dann dort abarbeiten. die art von ausgabe die du willst ist mit einem query nicht sinnvoll lösbar.


Decryptor
21.12.2014, 12:42

naja es sind ca 300 foren die ich so verknüpfen will.
also schlägst du mir auch wieder die php lössung vor?


raid-rush
21.12.2014, 12:59

Ist trotzdem eine kleine Datenmenge die gut in ein Array passt. Ist sicher weniger Rechen- und Speicher-intensiv als viele Querys.


$array = fetch_assoc<--sql<--(select * from menu);
also ein array mit der DB drin.

function get_menu($id,$array,$menu=0){
foreach($array AS $entry){if($entry[id]==$id){$next = $entry[parent_id]; $menu[] = $entry;break;}}
if($entry[parent_id]!=0){get_menu($next,$array,$menu);}
return $menu;
}
$menu = get_menu(6,$array);
var_dump(array_reverse($menu));


Möglicherweise mit Fehlern, aber so vom Prinzip sollte es passen.


Murdoc
21.12.2014, 17:27

;raid-rush

Dein Ansatz ist gut, deine Umsetzung hingegen ... :-P
Das kann so gar nicht funktionieren, da $menu per Wert übergeben wird (die falsche Umwandlung von 0 zu einem array mal dahin gestellt). $menu wird daher jedes mal kopiert sobald du schreibend darauf zugreifst.

Das ganze lässt sich auch ohne Rekursion lösen:

<?php

class Forum {
public $id;
public $name;
public $menu = [];
public $prev = null;

public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
}
}

/**
* maps all sub-forums of $cid
*
* ;param int $cid
* ;return Forum
*/
function map_forums($cid = 0) {
//$pdo = new PDO(..;);

//$res = $pdo->query('
//SELECT `ID`, `Name`, `Parent_ID`
//FROM `Foren`
//ORDER BY `ID` ASC, `Parent_ID` ASC
//');

$res = [
[ 'ID' => '1', 'Name' => 'Haupt', 'Parent_ID' => '0' ],
[ 'ID' => '2', 'Name' => 'Hauptsub_a', 'Parent_ID' => '1' ],
[ 'ID' => '3', 'Name' => 'Hauptsub_b', 'Parent_ID' => '1' ],
[ 'ID' => '4', 'Name' => 'Sub_a', 'Parent_ID' => '2' ],
[ 'ID' => '5', 'Name' => 'Sub_a2', 'Parent_ID' => '2' ],
[ 'ID' => '6', 'Name' => 'subsub', 'Parent_ID' => '4' ]
];

$root = new Forum('0', '<root>');

// forum maps
$tbl = [ '0' => $root ];
$stk = [];

foreach ($res as $itm) {
$pid = $itm['Parent_ID'];
$iid = $itm['ID'];

if (!isset ($tbl[$pid])) {
// assume that forum $pid gets defined later
$stk[$pid] = 1;
$tbl[$pid] = new Forum($pid, '<missing>');
}

if (isset ($stk[$iid])) {
// resolve missing link
unset ($stk[$iid]);
$frm = $tbl[$iid];
$frm->name = $itm['Name'];
} else {
// create new entry
$frm = new Forum($itm['ID'], $itm['Name']);
$tbl[$iid] = $frm;
}

$frm->prev = $tbl[$pid];
$tbl[$pid]->menu[] = $frm;
}

// if (!empty ($stk))
// throw new Error('some parent-forums are missing');

if (!isset ($tbl[$cid]))
return null;

return $tbl[$cid];
}

$res = map_forums(6);

if ($res === null)
echo "forum 6 does not exists";
else {
$stk = [];
do {
array_unshift($stk, $res->name);
$res = $res->prev;
} while ($res !== null);

echo htmlentities(implode(' --> ', $stk));
}



Wie du sehen kannst, kann man mittels "->prev" den Baum nach oben wandern.


Ähnliche Themen zu Sql schleife, subselect oder join oder doch was anderes?
  • HTC Legend, Desire oder doch was anderes?
    Hallo! Ich brauche relativ dringend ein neues Handy. Hab' im Moment zwei steinalte Nokias im Einsatz, die beide einen Sprung in der Oberschale haben... (und die 10 Euro die eine neue kosten würde, sinds mir nicht mehr wert..;) Jetzt solls was modernes sein. Zuerst dachte ich an einen Blackberry, d [...]

  • Crosstrainer kaufen oder doch was anderes?
    Hallo liebe RR´ler. Ich habe vor mir einen Crosstrainer zu kaufen. Bsp: (;;;spielgeschenke~de/bild/koe/hudora/65270;jpg) Manche fragen sich jetzt wofür! Ganz einfach. Ich wiege 110 Kilo, bin 1,78m groß und möchte abspecken. Ebenfalls möchte ich ein wenig meine Ausdauert traniere [...]

  • basic oder doch was anderes
    also ich habe jetzt blitz3d ist ein bisschen komisch , als ich die ganzen anderen progs sah hatten sie viel mehr ich weiß jetzt garnicht was ich machen soll mit blitz3d weiter machen oder c++/c# oder ganz was anderes anfangen ich weiß ich stell ziehmlich ähnliche fragen doch ich möchte eben was [...]

  • Iphone oder doch was anderes
    Hi also ich hatte bis jetzt in Nokia N95 und war begeistert davon... aber jetzt muss was neues her. Was mir sehr wichtig ist : Min 5mpx Kamera W-lan(muss nicht unbedingt sein) Guten Musikplayer Naja als erstes viel mir das Iphone und Nokia N97 ein aber ich finde keinen geeigneten Tarif daf [...]



raid-rush.ws | Imprint & Contact pr