2017-04-04 46 views
6

Alt kategorilerinin yanı sıra n kategori sayısı olabilecek bir veritabanı oluşturmaya çalışıyorum.İç İçe Aktarılan Sipariş Setini MySQL/PHP'de Uygula

Önce silinen düğümler vb sonra

için alt düğümü nasıl yönetileceği gibi bir düğüm silerken bir sorunla karşı karşıya olduğu, bu

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

gibi bitişiklik modeli veritabanı oluşturmak için çalıştı ama

: her Şekil Joe Celko sample_structure

Tablo Yapıları tarafından İç İçe al Set uygulamaya çalışıyorum

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 | 
+----+-----------------+-----+-----+ 

ancak rgt ve lft numaralı yeni düğümleri ekleyemiyorum. Bunu kullanıyorum ama rgt ve lft doğru değerlerini üretmiyor.

LOCK TABLE nested_category WRITE; 

SELECT @myRight := rgt FROM nested_category 
WHERE name = 'Mobile'; 

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

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

UNLOCK TABLES; 
+0

nasıl alt düğümleri yönetmek istiyoruz? Büyükbabalarının çocuklarına mı yoksa ebeveynleriyle mi siliniyorlar? –

+0

Büyükbabaların çocuksu ol – jpm

+0

Kazara olsa bile kök düğüm silinirse ne olur? –

cevap

4

Bu http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ kaynak kodu bence?

İyi bir sorgu kullanmıyorsunuz, bu bir add a brother node.

Sen peşindesiniz 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;