php - 表示分层任务/子任务的最佳方式 (MySQL/PHP)

标签 php mysql laravel hierarchy nested-sets

我正在制作一个简单的待办事项应用程序 (Laravel4/MySQL),它需要能够创建任务和子任务(限制为最多 3 个级别)

我正在检查 Laravel 的嵌套集实现 herehere .这对我的要求来说是矫枉过正吗?

我猜测嵌套集在全局范围内保存层次结构数据(而不是说,基于每个用户或每个项目)并且更适合项目数量有限的多级菜单等项目。 对于我的案例来说,最好的实现是什么,其中数百个用户将拥有大量项目并且每个项目都有数百个多级任务/子任务?如果我为我的案例实现嵌套集,是否会有不必要的遍历/开销?

最佳答案

我建议阅读 Managing hierarchical data in mysql 文章。

简而言之,

CREATE TABLE category(
        category_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        parent INT DEFAULT NULL
);

INSERT INTO category VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
        (4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),(7,'MP3 PLAYERS',1),(8,'FLASH',7),
        (9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);

SELECT * FROM category ORDER BY category_id;
+-------------+----------------------+--------+
| category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |
+-------------+----------------------+--------+

查询检索所有数据:

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
WHERE t1.name = 'ELECTRONICS';

只检索叶子名称:

SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;

检索路径:

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
WHERE t1.name = 'ELECTRONICS' AND t3.name = 'FLASH';

关于php - 表示分层任务/子任务的最佳方式 (MySQL/PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23037007/

相关文章:

laravel - nuxtjs 如何/在哪里设置授权 header

php - 如何在 Android 上使用 SSL 与多实体

mysql - 无法让 JDBC 驱动程序在 tomcat jsp 中工作

mysql - 如果给定大量数据来尝试找出最适合的结果,我将如何查询 MySQL 数据库?

php - 在 Laravel 中将模型链接到父级

php - 在午夜缓存数据库查询?

php - 计算与 IN 子句中的所有值匹配的所有行

php - "Training mode"使用 PDO 和 MySQL

php - Silverstripe:无法从后端删除页面

php - Mysql Select查找重复项