2012-01-27 63 views
2

我创建了一个脚本,它构建了一个包含类别,子类别和子子类别的菜单。 要获得这些项目,我使用3个单独的MySQL查询。具体如下:如何优化mysql查询获取类别和子类

要检索的主要类别:

SELECT id, name FROM categories WHERE parent_id=0 

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

SELECT id, name FROM categories WHERE parent_id=? 

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

如何优化此脚本以使用较少的sql查询? 预先感谢您。

+0

你想什么实现?如果你正在提取所有的类别,你可以选择所有的类别,并通过将它们保存在一个数组中来将它们组织在一个树形结构中(当你存储一个类别时,你检查你是否已经有一个父类的记录,将它保存为小孩) – mishu 2012-01-27 13:34:20

+0

真的!我们的行星里有绿色的猫:哦,尽管你的问题+1。 – Husam 2016-01-05 12:57:54

回答

11

尝试此查询 -

类别+子类:

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 
+0

这很好用。谢谢。 Up投票,并会尽快批准:) – 2012-01-27 13:36:29

+1

是的,这个查询将只显示子类别。要显示更多级别,请再添加一个JOIN。 – Devart 2012-01-27 13:36:48

+0

如果我们不知道类别级别的数量,我们如何编写此查询? – anoop 2017-11-29 13:19:23

0

的选择,如果你只想要一个类的父类(结果行计数应该等于类的数量/子行):

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