【问题标题】:How to optimize mysql query getting categories and subcategories如何优化mysql查询获取类别和子类别
【发布时间】:2012-02-20 11:29:34
【问题描述】:

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

检索主要类别:

SELECT id, name FROM categories WHERE parent_id=0

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

SELECT id, name FROM categories WHERE parent_id=?

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

如何优化此脚本以使用更少的 sql 查询? 提前谢谢你。

【问题讨论】:

  • 你想达到什么目的?如果您仍然要获取所有类别,则可以选择所有类别并通过将它们保存在数组中以树结构组织它们(当您存储类别时,您检查您是否已经有其父项的记录,如果有的话保存为孩子)
  • 真的!!我们的星球上有绿猫吗:O,尽管您的问题 +1。

标签: php mysql optimization mysqli


【解决方案1】:

如果您只想要一个类别的父类别(结果行数应等于类别/子类别的行数)的替代方法:

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

【讨论】:

    【解决方案2】:

    试试这个查询 -

    类别+子类别:

    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
    

    【讨论】:

    • 这非常有效。谢谢。投了赞成票,时间一过就会批准:)
    • 是的,此查询将仅显示子类别。要显示更多级别,请再添加一个 JOIN。
    • 如果我们不知道类别级别的数量,我们如何编写这个查询?
    【解决方案3】:

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

    还有其他更有效的方法可以将层次结构存储在数据库中。有关完整的故事,请查看这篇文章。它将向您介绍嵌套集。

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

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2022-01-05
      • 2011-12-14
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多