Kırık setin Onarım

3 Cevap php

I have to repair broken nested set chains via script or sql. The table contains a left and a right value column, but no parent id column. I am able to compute the level of each node within the nested set. There are gaps in left and right values. The structure of computed levels is valid. Does someone know a solution to close the gaps via SQL? (MySQL)

Önerilerin hiçbiri benim soruna uygun, ama nişan için teşekkürler.

I worked out a solution for me: 1. first step compute parent ids and transform to adjacency list 2. use Joe Celko's approach to convert adjacency lists to nested sets 3. update old left and right values

3 Cevap

ben sadece sahip sağ ve sol değerlerden bir parent_id sütunu üretecek, daha sonra sağ ve sol değerleri yeniden.

Eğer mevcut tabloyu değiştirmek istemiyorsanız, hatta geçici bir tabloda bu yapabilirdi.

Bir düğüm her atası (c) daha küçük bir left ve daha büyük right değeri vardır. Ve hemen üst (p) büyük left değeri ile (atalarımızın) bu sette biridir.

Örneğin

CREATE TABLE nested (
  id int AUTO_INCREMENT,
  name varchar(16),
  parentid int DEFAULT 0,
  lft int(11),
  rgt int(11),
  PRIMARY KEY (id)
)

INSERT INTO
    nested (name, parentid, lft, rgt)
VALUES
    ('1'      ,0,1,20),
    ('1.1'    ,0,2,9),
    ('1.1.1'  ,0,3,4),
    ('1.1.2'  ,0,5,6),
    ('1.1.3'  ,0,7,8),
    ('1.2'    ,0,10,19),
    ('1.2.1'  ,0,11,14),
    ('1.2.1.1',0,12,13),
    ('1.2.2'  ,0,15,16),
    ('1.2.3'  ,0,17,18)

SELECT
  p.id as pid, p.name as pname,
  c.id as cid, c.name as cname  
FROM
  nested as c
LEFT JOIN
  nested as p
ON
  p.lft=(
    SELECT
      MAX(lft)
    FROM
      nested AS l
    WHERE
      c.lft > l.lft
      AND c.lft < l.rgt
  )

iadeler

pid    pname    cid    cname
NULL   NULL     1      1
1      1        2      1.1
2      1.1      3      1.1.1
2      1.1      4      1.1.2
2      1.1      5      1.1.3
1      1        6      1.2
6      1.2      7      1.2.1
7      1.2.1    8      1.2.1.1
6      1.2      9      1.2.2
6      1.2      10     1.2.3

(Doğru sırayla yapılması halinde) tamamen tamir edilebilir bir iç içe kümesi yolsuzluk için 4 veya 5 farklı durumlar vardır. Snaggle Sol> = Doğru değilse denetler görmek için basit bir tetikleyici ile önlemek kolaydır. Ben bu sırayla bir setin tamir dan iyi sonuçlar aldık. Aşağıdaki gibi sorun bozuldu sonra SQL kendisi zor değildir.

  • Çapraz (01:04 03:06) veya (1:2 2:3)
  • (01:03 01:04) Üst / Alt OR (01:04 02:04)
  • Gap (02:03 05:06 01:07) veya (02:04 05:06 01:07)
  • Snaggle (2:1 04:02) OR (01:01)