@tbt: du brauchst aber 2 Tables, richtig?
wie macht mans am besten?
Einklappen
X
-
Sunshine CMS
BannerAdManagement
Borlabs - because we make IT easier
Formulargenerator [color=red]Neu![/color]
Herkunftsstatistik [color=red]Neu![/color]
-
@tbt: habe mich wohl falsch ausgedrückt. Ich meinte, man braucht grundsätzlich 2 Tabellen, um mit einem SQL-Statement rekursiv hochzugehen, richtig?Sunshine CMS
BannerAdManagement
Borlabs - because we make IT easier
Formulargenerator [color=red]Neu![/color]
Herkunftsstatistik [color=red]Neu![/color]
Kommentar
-
1 Tabelle reicht da doch
select *
from tab a1
inner join tab a2 on ( ... )
inner join tab a3 on ( ... )
...
inner join tab an on ( ... )TBT
Die zwei wichtigsten Regeln für eine berufliche Karriere:
1. Verrate niemals alles was du weißt!
PHP 2 All • Patrizier II Browsergame
Kommentar
-
@tbt: so wie ich das sehe, pro inner join = eine ebene, richtig?
SELECT b.* FROM `bb_content` b INNER JOIN bb_content bb ON (b.c_id=bb.c_parentid)
so würde ich alle ebenen bekommen, das will ich aber nicht, sondern nur von einer bestimmten unterebene nach oben alle ebenen.Sunshine CMS
BannerAdManagement
Borlabs - because we make IT easier
Formulargenerator [color=red]Neu![/color]
Herkunftsstatistik [color=red]Neu![/color]
Kommentar
-
@tbt: wie machst du das beim Löschen, wenn du von einer oberen Ebene alle nach unten gehenden Ebenen löschen willst? Dein Delete wird doch sicher ein Join haben oder? Wenn ja, wie sieht der aus?Sunshine CMS
BannerAdManagement
Borlabs - because we make IT easier
Formulargenerator [color=red]Neu![/color]
Herkunftsstatistik [color=red]Neu![/color]
Kommentar
-
PHP-Code:function deletePoint( $point ) {
// Infos des Menü-Punkts auslesen
$tmp = $this->db->single( ' SELECT sort_i, parent_i, level_i FROM '.$this->menu.'
WHERE '.$this->menuid.' = '.$point );
// alle Unterpunkte suchen und loeschen
$this->db->select( ' SELECT child_i
FROM '.$this->menumenu.'
WHERE parent_i = '.$point, 'sub' );
if( $this->db->rows( 'sub' ) ) {
$t = array();
while( $row = $this->db->fetch( 'sub' ) ) {
$t[] = $row['child_i'];
}
$this->db->free( 'sub' );
$this->db->query( ' DELETE FROM '.$this->menumenu.'
WHERE child_i IN ( '.implode( ', ', $t ).' ) ' );
$this->db->query( ' DELETE FROM '.$this->menu.'
WHERE '.$this->menuid.' IN ( '.implode( ', ', $t ).' ) ' );
}
// Punkt loeschen
$this->db->query( ' DELETE FROM '.$this->menumenu.' WHERE child_i = '.$point );
$this->db->query( 'DELETE FROM '.$this->menu.' WHERE '.$this->menuid.' = '.$point );
// Menü neu sortieren
$this->db->query( ' UPDATE '.$this->menu.' SET
sort_i = sort_i - 1
WHERE
sort_i > '.$tmp['sort_i'].'
AND parent_i = '.$tmp['parent_i'].'
AND level_i = '.$tmp['level_i'] );
// Uebergeordnete ID zurückgeben
return $tmp['parent_i'];
}
TBT
Die zwei wichtigsten Regeln für eine berufliche Karriere:
1. Verrate niemals alles was du weißt!
PHP 2 All • Patrizier II Browsergame
Kommentar
-
Habs mit 2 Querys gelöst:
PHP-Code:$this->_db->query("DELETE c, cp FROM {prefix}content_structure cs
INNER JOIN {prefix}content c ON ( cs.c_id='".$i."' AND (c.c_id = cs.child_id OR c.c_parentid = cs.child_id))
LEFT JOIN {prefix}content_properties cp ON (cp.c_id=c.c_id)
LEFT JOIN {prefix}permissions p ON (p.id=c.c_id AND p.`module`='content')");
$this->_db->query("DELETE cs, cs2 FROM {prefix}content_structure cs
INNER JOIN {prefix}content_structure cs2 ON (cs2.c_id=cs.child_id)
WHERE cs.c_id='".$i."'");
Sunshine CMS
BannerAdManagement
Borlabs - because we make IT easier
Formulargenerator [color=red]Neu![/color]
Herkunftsstatistik [color=red]Neu![/color]
Kommentar
-
Sorry, dass ich den Beitrag nochmal nach oben hole. Aber ich wurde auf diesen Verwiesen. Euer Code klappt ganz gut, doch irgendwie wird bei mir nur die höchste Ebene angezeigt. Allerdings will ich (OHNE Benutzerrechte einfach nur so) alle aufgeklappten Ebenen anzeigen. Könnt ihr mir da weiterhelfen. Ich habe folgende Tabellenstruktur gewählt: (Aus Beitrag 1)
menu
========
menu_id ( Menupunkt )
parent_id ( übergeordneter Menupunkt, oder 0 wenn ganz oben )
level ( Baumtiefe )
sort ( Sortierung bei nebeneinander liegenden Menupunkten )
Reicht das? Habe auch mit den zwei Tabellen ausprobiert. Klappt aber nicht so ganz. Wie bekomm ich das möglichst Performat hin, dass er mir alle benötigten Ebenen aufklappt. (Wie Windows Explorer)
Gruß
Holger
Kommentar
-
In der Tabelle speicherst du für jede Ebene sämtliche IDs der darunter folgenden Ebenen.
Beispiel:
Code:Ebene 1.0.0 - ID 1 Ebene 1.1.0 - ID 2 Ebene 1.2.0 - ID 3 Ebene 1.1.1 - ID 4 Ebene 1.1.2 - ID 5 Ebene 2.0.0 - ID 6 Ebene 2.2.0 - ID 7
Code:menu_id - child_id 1.........1 1.........2 1.........3 1.........4 1.........5 2.........2 2.........4 2.........5 3.........3 4.........4 5.........5 6.........6 6.........7 7.........7
Sunshine CMS
BannerAdManagement
Borlabs - because we make IT easier
Formulargenerator [color=red]Neu![/color]
Herkunftsstatistik [color=red]Neu![/color]
Kommentar
-
Ah, ok...
Danke für die Antworten!
Wie muss denn die Abfrage aussehen, wenn ich keine Rechteprüfung möchte?
Nur die Ausgabe eines Menus...
So sieht mein DB-Design aus, aber ich komme nicht auf die Abfrage. Habe nichtmal nen Ansatz
--
-- Tabellenstruktur für Tabelle `menus`
--
CREATE TABLE IF NOT EXISTS `menus` (
`menu_id` mediumint(8) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`menu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
--
-- Daten für Tabelle `menus`
--
INSERT INTO `menus` (`menu_id`, `name`) VALUES
(1, 'Ebene 1.0.0'),
(2, 'Ebene 1.1.0'),
(3, 'Ebene 1.2.0'),
(4, 'Ebene 1.1.1'),
(5, 'Ebene 1.1.2'),
(6, '2.0.0'),
(7, '2.2.0');
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `menu_menu`
--
CREATE TABLE IF NOT EXISTS `menu_menu` (
`id` mediumint(8) NOT NULL auto_increment,
`parent_id` mediumint(8) NOT NULL,
`child_id` mediumint(8) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
--
-- Daten für Tabelle `menu_menu`
--
INSERT INTO `menu_menu` (`id`, `parent_id`, `child_id`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 1, 4),
(5, 1, 5),
(6, 2, 2),
(7, 2, 4),
(8, 2, 5),
(9, 3, 3),
(10, 4, 4),
(11, 5, 5),
(12, 6, 6),
(13, 6, 7),
(14, 7, 7);Zuletzt geändert von Seggl-hoch-drei; 04.05.2009, 18:07.
Kommentar
Kommentar