2017-04-04 1 views
6

Ich versuche, eine Datenbank zu erstellen, in der n Anzahl der Kategorien sowie ihre Unterkategorien sein könnte.Implementieren verschachtelter Reihenfolge in MySQL/PHP

Zuerst versuchte ich adjacency Modell-Datenbank wie diese

+-------------+----------------------+--------+ 
| category_id | name     | parent | 
+-------------+----------------------+--------+ 
|   1 | Electronics   | NULL | 
|   2 | Mobile    |  1 | 
|   3 | Washing Machine  |  1 | 
|   4 | Samsung    |  2 | 
+-------------+----------------------+--------+ 

zu schaffen, aber ich war vor einem Problem, wenn ein Knoten zu löschen, wie, wie die untergeordneten Knoten für gelöschte Knoten verwalten usw.

dann ich versuche Nested Order Set von Joe Celko sample_structure

Tabellenstrukturen in jeder Figur zu implementieren:

Figure 1: 
+----+-------------+-----+-----+ 
| id | name  | lft | rgt | 
+----+-------------+-----+-----+ 
| 1 | Electronics | 1 | 2 | 
+----+-------------+-----+-----+ 

Figure 2: 
+----+-------------+-----+-----+ 
| id | name  | lft | rgt | 
+----+-------------+-----+-----+ 
| 1 | Electronics | 1 | 4 | 
+----+-------------+-----+-----+ 
| 2 | Mobile  | 2 | 3 | 
+----+-------------+-----+-----+ 

Figure 3: 
+----+-----------------+-----+-----+ 
| id | name   | lft | rgt | 
+----+-----------------+-----+-----+ 
| 1 | Electronics  | 1 | 6 | 
+----+-----------------+-----+-----+ 
| 2 | Mobile   | 2 | 3 | 
+----+-----------------+-----+-----+ 
| 3 | Washing Machine | 4 | 5 | 
+----+-----------------+-----+-----+ 

Figure 4: 
+----+-----------------+-----+-----+ 
| id | name   | lft | rgt | 
+----+-----------------+-----+-----+ 
| 1 | Electronics  | 1 | 8 | 
+----+-----------------+-----+-----+ 
| 2 | Mobile   | 2 | 5 | 
+----+-----------------+-----+-----+ 
| 3 | Washing Machine | 6 | 7 | 
+----+-----------------+-----+-----+ 
| 4 | Samsung   | 3 | 4 | 
+----+-----------------+-----+-----+ 

aber ich kann keinen neuen Knoten mit korrekten rgt und lft einfügen. Ich benutze dies, aber es erzeugt nicht die richtigen Werte von rgt und lft.

+0

Wie wollen Sie die untergeordneten Knoten verwalten? Werden sie Kinder ihrer Großeltern oder werden einfach mit ihren Eltern gelöscht? –

+0

Kind von Großeltern werden – jpm

+0

Was passiert, wenn der Root-Knoten gelöscht wird, auch wenn versehentlich? –

Antwort

4

Dieser http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ist Ihr Quellcode, denke ich?

Sie verwenden nicht die gute Abfrage, diese ist die add a brother node.

Sie sind nach dem add a child node:

LOCK TABLE nested_category WRITE; 

SELECT @myLeft := lft FROM nested_category 
WHERE name = 'Mobile'; 

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; 
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; 

INSERT INTO nested_category(name, lft, rgt) VALUES('LG', @myLeft + 1, @myLeft + 2); 

UNLOCK TABLES; 
0
CREATE PROCEDURE nested_insert(_name VARCHAR(45)) 
BEGIN 
DECLARE _number int; 
set @var=0; 

-- first insert paramater value(_name) into nested_table 
INSERT into nested_table(name) VALUE(_name); 

-- count the total row value from nested table; 
SELECT count(*) from nested_table into _number; 

-- first update the all lft column from top to button by varibale with increment 
UPDATE nested_table set lft=(@var:[email protected]+1) where id <=_number; 

-- second update the all rgt column from button to top by varibale with increment in descending order id 
UPDATE nested_table set rgt=(@var:[email protected]+1) where id<=(_number+1)*2 ORDER BY id desc ; 
end; 
Verwandte Themen