如何优化mysql查询获取类别和子类别

时间:2012-01-27 13:26:35

标签: php mysql optimization mysqli

我创建了一个脚本,用于构建包含类别,子类别和子子类别的菜单。 为了获得这些项目,我使用3个单独的MySQL查询。如下:

检索主要类别:

SELECT id, name FROM categories WHERE parent_id=0

要检索我使用的每个类别的子类别:

SELECT id, name FROM categories WHERE parent_id=?

哪里?是父类别的ID。 然后,我再次为每个子类别运行查询。

如何优化此脚本以使用较少的SQL查询? 提前谢谢。

3 个答案:

答案 0 :(得分:12)

尝试此查询 -

类别+子类别:

SELECT c1.id, c1.name, c2.id, c2.name FROM categories c1
  LEFT JOIN categories c2
    ON c2.parent_id = c1.id
WHERE c1.parent_id = 0

类别+子类别+子子类别:

SELECT c1.id, c1.name, c2.id, c2.name, c3.id, c3.name FROM categories c1
  LEFT JOIN categories c2
    ON c2.parent_id = c1.id
  LEFT JOIN categories c3
    ON c3.parent_id = c2.id
WHERE c1.parent_id = 0

答案 1 :(得分:2)

某些数据库服务器具有帮助这些操作的构造。但是,MySQL不是其中之一。

在数据库中存储更高效的层次结构的替代方法。有关完整的故事,请查看此文章。它将向您介绍嵌套集。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

答案 2 :(得分:0)

如果您只想要某个类别的父类别(结果行计数应该等于类别/子类别行数),则可以选择其他方式:

SELECT c1.id, c1.name, c2.id, c2.name 
    FROM category c1
       LEFT JOIN category c2 ON c1.parent_id = c2.id