【问题标题】:Need a mysql query需要一个mysql查询
【发布时间】:2009-12-12 05:55:59
【问题描述】:

我有一个名为“角色”的表

id | parent_id | name
---+-----------+--------------------
1  | NULL      | Machine
2  | 3         | Ram
3  | 4         | Cpu
4  | NULL      | Computer
5  | NULL      | Electronic Device

我需要一个(mysql 或 postgress sql)查询,它会给出特定角色的可能父母。

例如

“计算机”可能的父角色是

id | name
---+-------------------
5  | Electronic Device
1  | Machine

请帮帮我

【问题讨论】:

  • 提供的数据中似乎没有逻辑关联。
  • 我认为单个查询不可能
  • @astander:我认为 lintdavis 想问的是 - 他引用了同一个表中的记录,并且他想在单个查询中列出给定特定记录的所有引用链
  • 提供的数据不完整。
  • 呃..我不明白..请检查你的'例如'

标签: sql mysql


【解决方案1】:

用途:

SELECT t.id,
       t.name
  FROM ROLES t
 WHERE t.parent_id IS NULL
   AND t.name != ?

...其中? 是您想要排除的任何name,如果它的parent_id 为空。

【讨论】:

  • null 可能是 parent_id 的可能性,以便没有父母。
  • 可能有数百个空条目,“计算机”就是其中之一。那它本身不应该是根吗?
  • 这就是 WHERE 子句的第二部分的用途。
  • 这不会忽略所有其他(数百个)空条目,只是在这种情况下是 Computer
  • 根据提供的数据,这正是查询将返回的内容。该问题要求可能的父记录。
【解决方案2】:

忽略您给定示例中的数据不匹配的事实,我认为您要做的是在数据库中存储和获取分层数据,最终会得到一系列父母和孩子。

有多种方法可以存储和检索此类数据。我强烈建议您阅读这篇 Sitepoint 文章:Storing Hierarchical Data in a Database

最常见的方法是邻接列表模型,您可以选择第一条记录,然后选择它的父项,然后选择它的父项,依此类推,直到您拥有整个记录链。这是一种重读、轻写的方法,并且易于实现。

如果您想要一种快速阅读的方法,修改后的先序树遍历(第 2 页)是一个了不起的算法。更难实现,但您可以在单个 SELECT 中选择整个子/父记录集。

【讨论】:

    【解决方案3】:

    根据其他用户的 cmets(可能缺少完整数据),它看起来像是一个自引用表。所以如果数据改正了可以试试

    select r2.* 
    from role as r1 inner join 
    role as r2 on r1.parent_id=r2.id 
    where r1.name='Computer';
    

    有数据

    id | parent_id | name
    ---+-----------+--------------------
    1  | NULL      | Machine
    2  | 3         | Ram
    3  | 4         | Cpu
    4  | 1         | Computer
    5  | NULL      | Electronic Device
    

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 2013-06-12
      • 2016-02-02
      • 2014-03-02
      相关资源
      最近更新 更多