Mysql 类别和子类别

Mysql 类别和子类别,mysql,sql,recursion,parent-child,Mysql,Sql,Recursion,Parent Child,我找到了本教程,我想使用所描述的方法,因为它比递归调用更好,但我有两个问题: 我怎样才能知道最深的层次?在某些页面中,我可能有2个,而在另一个页面中,我可能有20个。我是否遗漏了什么,或者只有在您知道运行时之前的最深级别时才能使用此方法 我有一个多语言数据库设计,如何更改查询以使用下面的表设计: 你的帮助将得到极大的赞赏。 你可能想考虑研究“嵌套集合”。这是一个很好的开始。此外,如果您使用的是ORM原则,则支持嵌套集功能。您可能需要提供该链接的概述。它有点长,大多数人在回答您的问题之前都不想阅读

我找到了本教程,我想使用所描述的方法,因为它比递归调用更好,但我有两个问题:

我怎样才能知道最深的层次?在某些页面中,我可能有2个,而在另一个页面中,我可能有20个。我是否遗漏了什么,或者只有在您知道运行时之前的最深级别时才能使用此方法

我有一个多语言数据库设计,如何更改查询以使用下面的表设计:


<>你的帮助将得到极大的赞赏。

你可能想考虑研究“嵌套集合”。这是一个很好的开始。此外,如果您使用的是ORM原则,则支持嵌套集功能。

您可能需要提供该链接的概述。它有点长,大多数人在回答您的问题之前都不想阅读它。您是否正在寻找一种完全在数据库中编码的解决方案?此外,您参考的教程假定深度已知,结果集中的列数取决于此深度。如果深度未知,则可能必须只返回两列父/子ID,并让使用代码处理动态深度。如果你能说明你在找什么,我也许能帮上更多的忙。
CREATE TABLE `categories` (
  `id` int(11) NOT NULL,
  `position` int(11) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `parent_id_fk` (`parent_id`),
  CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `categories_locale` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `slug` varchar(100) NOT NULL DEFAULT '',
  `name` varchar(40) NOT NULL DEFAULT '',
  `category_id` int(11) NOT NULL,
  `locale_id` smallint(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;