Решение было простым, хотя и спорным по его эффективности.
Я изменил структуру таблицы следующим образом:
CREATE TABLE `domains` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`domain` CHAR(50) NOT NULL,
`level` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MYISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1
Уровень относится к глубине дерева.
Пример данных:
insert into `domains`(`id`,`domain`,`level`) values (1,'.com',0);
insert into `domains`(`id`,`domain`,`level`) values (2,'example.com',1);
insert into `domains`(`id`,`domain`,`level`) values (3,'sub1.example.com',2);
insert into `domains`(`id`,`domain`,`level`) values (4,'sub2.example.com',2);
insert into `domains`(`id`,`domain`,`level`) values (5,'s1.sub1.example.com',3);
insert into `domains`(`id`,`domain`,`level`) values (6,'s2.sub1.example.com',3);
insert into `domains`(`id`,`domain`,`level`) values (7,'sx1.s1.sub1.example.com',4);
insert into `domains`(`id`,`domain`,`level`) values (8,'sx2.s2.sub1.example.com',4);
insert into `domains`(`id`,`domain`,`level`) values (9,'x.sub2.example.com',3);
insert into `domains`(`id`,`domain`,`level`) values (10,'t.sx1.s1.sub1.example.com',5);
Итак, допустим, нам дан sub1.domain.com, и мы хотим знать всех его дочерних элементов, запрос довольно прост:
SELECT * FROM domains WHERE domain LIKE "%.sub1.example.com" ORDER BY level;
Конечно, если нам нужен sub1.example.com в нашем наборе результатов, мы можем просто сделать:
SELECT * FROM domains WHERE domain LIKE "%sub1.example.com" ORDER BY level;
Из результирующего набора мы получаем список всех детей, которым дан ребенок.
Удалить дочернего элемента (и всех связанных с ним дочерних элементов) просто и очень похожий запрос
DELETE FROM domains WHERE domain LIKE "%sub1.example.com";
Вставка проста, и для этого нужно всего 2 запроса (при условии, что у пользователя есть выпадающий список и он выбирает родителя):
SELECT level FROM domains WHERE domain = "sub2.example.com";
INSERT INTO domains (domain, level) VALUES ($sub + ".sub2.example.com", $level+1)
Прошу прощения за смешанный синтаксис PHP + MySQL, но вы поняли идею.