2015-01-06 3 views
1

Я использую php для создания каталога дерева каталогов. Каталог (данные) взяты из таблицы базы данных MySQL, но я не имею понятия, чтобы написать SQL, чтобы получить записи с того, я хочу:Создание дерева каталогов с SQL в MySQL

Создание SQL таблицы:

CREATE TABLE section (
    section_id tinyint(4) NOT NULL auto_increment, 
    name varchar(500) default NULL, 
    parent_id tinyint(4) default NULL, 
    lineage varchar(45) default NULL, 
    level tinyint(4) default NULL, 
PRIMARY KEY (section_id) 
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; 

а также вставить SQL данных:

INSERT INTO section (
section_id,name,lineage,parent_id,level) 
VALUES 
('1', 'Dashboard', '1', '0', '1'), 
('2', 'Slider', '2', '0', '1'), 
('3', 'Column', '3', '0', '1'), 
('4', 'Column list', '3-4', '3', '2'), 
('5', 'Add column', '3-5', '3', '2'), 
('6', 'Permission', '6', '0', '1'), 
('7', 'Permission Group', '6-7', '6', '2'), 
('8', 'User List', '6-8', '6', '2'), 
('9', 'Section permission', '6-9', '6', '2'), 
('10', 'Add permission', '6-7-10', '7', '3'), 
('11', 'Add user', '6-8-11', '8', '3'), 
('12', 'Add section', '6-9-12', '9', '3'); 

Все записи таблицы, которые создали:

section_id  name    parent_id level 
----------------------------------------------------- 
1    Dashboard   0   1 
2    Slider    0   1 
3    Column    0   1 
4    Column list   3   2 
5    Add column   3   2 
6    Permission   0   1 
7    Permission Group 6   2 
8    User List   6   2 
9    Section permission 6   2 
10    Add permission  7   3 
11    Add user   8   3 
12    Add section   9   3 

Я бы хотел использовать/некоторую SQL получить строки в следующем порядке:

section_id  name    parent_id level 
----------------------------------------------------- 
1    Dashboard   0   1 
2    Slider    0   1 
3    Column    0   1 
4    Column list   3   2 
5    Add column   3   2 
6    Permission   0   1 
7    Permission Group 6   2 
10    Add permission  7   3 
8    User List   6   2 
11    Add user   8   3 
9    Section permission 6   2 
12    Add section   9   3 

Для создания этого дерева каталогов:

- Dashboard 
- Slider 
- Column 
    - Column list 
    - Add column 
- Permission 
    - Permission Group 
    - Add permission 
    - User List 
    - Add user 
    - Section permission 
    - Add Section 

У меня есть идея, используя много SQL, чтобы получить каталоги и магазин данные в php-объект. И это SQL, чтобы получить подкаталог:

SELECT * FROM tbl_section AS a1 WHERE a1.parent_id = 0; 
SELECT * FROM tbl_section AS a1 WHERE a1.parent_id = 1; 
SELECT * FROM tbl_section AS a1 WHERE a1.parent_id = 2; 
SELECT * FROM tbl_section AS a1 WHERE a1.parent_id = 3; 

и так далее.

Тем не менее, ему нужно запустить select sql 100 раз, если существует 100 каталогов, Я не думаю, что это хороший метод, любая другая идея?

+1

Как вы обнаруживаете, реляционные базы данных пытаются моделировать иерархические или древовидные структуры данных. Фактически, это один из самых сложных и технических вопросов в этой области (http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a- реляционные базы данных). –

+0

Спасибо за ваш комментарий, и я нашел способ работает для меня по вашей ссылке.Хотя это может быть не самый динамичный способ, но он работает для меня. Возможно, я вставляю это в качестве ответа на вопрос для общественности. – user2446447

+0

@BaconBits: на самом деле это не так сложно, если вы не используете MySQL, который является одной из немногих реляционных баз данных, которые все еще не поддерживают рекурсивные запросы. –

ответ

1

Этой метод (Lineage Column) не является лучшим и наиболее динамичным способом перечислить дерево каталогов, которые получают данные из MySQL таблицы, но это довольно легко и быстро:

Связанных вопросов в StackOverflow:
What are the options for storing hierarchical data in a relational database?
Реферировано статья: Lineage Column (ака материализованного Путь, Путь перечисление) http://www.ferdychristant.com/blog/articles/DOMM-7QJPM7


Это Выбрать SQL с помощью «Lineage Co lumn»метод:

SELECT c.section_id, c.name, c.lineage, c.level, c.parent_id, 
    (SELECT COUNT(*) FROM section 
    where section.lineage 
    LIKE (CONCAT(c.lineage,'%')) AND 
    section.lineage!=c.lineage) as replies 
FROM section as c 
order by c.lineage; 

И это возвращает запись с заказом я хочу:

section_id name    lineage  level parent_id replies 
---------------------------------------------------------------------- 
1   Dashboard   1   1  0   0 
2   Slider    2   1  0   0 
3   Column    3   1  0   2 
4   Column list   3-4   2  3   0 
5   Add column   3-5   2  3   0 
6   Permission   6   1  0   6 
7   Permission Group 6-7   2  6   1 
10   Add permission  6-7-10  3  7   0 
8   User List   6-8   2  6   1 
11   Add user   6-8-11  3  8   0 
9   Section permission 6-9   2  6   1 
12   Add section   6-9-12  3  9   0 

Это код PHP эхо каталог, упомянутый в вопросе:

<?php 
CONST SERVERNAME = ""; //your mysql server name 
CONST USERNAME = ""; //your mysql user name 
CONST PASSWORD = ""; //your mysql password 
CONST DATABASE = ""; //your mysql database name 

// Create connection 
$conn = new mysqli(SERVERNAME, USERNAME, PASSWORD, DATABASE); 

// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

    $sql = "SELECT c.section_id, c.name, c.lineage, c.level, c.parent_id, 
     (SELECT COUNT(*) FROM section 
     where section.lineage 
     LIKE (CONCAT(c.lineage,'%')) AND 
     section.lineage!=c.lineage) as replies 
    FROM section as c 
    order by c.lineage"; 

    $html = ""; 
    foreach ($conn->query($sql) as $row) { 
     switch ($row['level']){ 
      case "1": $html.="-".$row['name'] . "<br />"; break; 
      case "2": $html.="&nbsp;&nbsp;-".$row['name'] . "<br />"; break; 
      case "3": $html.="&nbsp;&nbsp;&nbsp;&nbsp;-".$row['name'] . "<br />"; break; 
     } 
    } 
    print $html; 
?> 

Номер в тексте php:

-Dashboard 
-Slider 
-Column 
    -Column list 
    -Add column 
-Permission 
    -Permission Group 
    -Add permission 
    -User List 
    -Add user 
    -Section permission 
    -Add section 
+0

... было бы здорово, если бы PHP был включен в теги OPs!?!?! – Strawberry

+0

Вы имели бы в виду «что было бы лучше, если бы слово« PHP »было включено в открытые теги»? Использование стандартных тегов php () vs php short tags () – user2446447

+0

Так как не понимаю, что такое «теги OPs» означает – user2446447

Смежные вопросы