通过引用链接中的表,我具有表类别和另一个表名称“包”来存储类别ID。
http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/hierarchical-data.html
Category
+-------------+----------------------+--------+
| 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 |
+-------------+----------------------+--------+
无论如何,在不知道我必须加入多少次之前,我可以离开加入直到没有父母离开了吗?
第二个问题,我的表“ package”仅存储最后一个/最小的类别ID,例如表中的“ 7-FLASH”,这是一个很好的做法,它仅存储最后/最小的类别ID,并通过加入餐桌?这样做是否会使每次查询都使数据库沉重?
提前致谢!
最佳答案
在MySQL中无法进行此类查询。
如果需要保持此数据库结构,则最快的方法可能是从表中选择相关数据,然后将客户端的数据处理到方法数组/联接中。
如果您无法充分缩小要选择的行数,则上述方法可能无法正常工作,在这种情况下,递归运行多个查询可能会更快。在第二个查询中,最好的方法是执行WHERE ID IN(list_of_parent_values)之类的操作,而不是每个父级执行1个查询。
最后,如果您可以更改数据结构,则可以使用一种特殊的树列值来通过单个SQL查询有效地选择所有节点。但是,需要更多的工作来插入和重新组织树。
有许多稍微不同的实现,请参见此处进行这样的讨论:
http://web.archive.org/web/20110606032941/http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
awesome_nested_set也是此模式的ruby实现:
https://github.com/collectiveidea/awesome_nested_set