【问题标题】:sql - get parentID with or without child in self refrenced tablesql - 在自引用表中获取带或不带子的父 ID
【发布时间】:2016-03-18 15:49:31
【问题描述】:

这是我的表的(活动)内容。 eventID 是“主键”,parentID 是引用事件(eventsID)的“外键”

自引用表:

eventID eventName parentID appFK 1 evt1 空 2 2 evt2 1 1 3 evt3 1 1 4 evt4 空 3 5 evt5 8 3 6 evt6 空 4 7 evt7 空 1 8 evt8 空 1

还有另一个像这样的表格内容(应用程序):

appID 应用名称 1 个应用程序1 2 应用程序2 3 应用程序3 4 应用程序4

我想使用给定的 appID 获取所有作为父母的事件 ID。如果一个孩子有给定的 appID,我想得到他的 parentID 而不是他自己。所以 appID = 1 的结果是这样的:

eventID eventName ParentID appFK 1 evt1 null 2 // 父事件有 appID = 1 的子事件 7 evt7 null 1 // 没有子节点且 appID = 1 的事件 8 evt8 null 1 // 父事件 appID = 1 并且有一个子事件

我在这里尝试了很多示例并阅读了很多解决方案,但我没有发现这样的问题。你能帮我写出正确的 SQL 吗?

谢谢。

【问题讨论】:

    标签: mysql sql self-referencing-table


    【解决方案1】:

    试试这个:

    SELECT DISTINCT COALESCE(e2.eventID, e1.eventID), 
           COALESCE(e2.eventName, e1.eventName),
           COALESCE(e2.appFK, e1.appFK)
    FROM events AS  e1
    LEFT JOIN events AS e2 ON e1.parentID = e2.eventID AND e1.appFK = 1
    WHERE (e1.appFK = 1 AND e1.parentID IS NULL) OR (e2.eventID IS NOT NULL)
    

    LEFT JOIN 获取 appID = 1 (e1.appFK = 1) 的子项的 父项 记录 (e1.parentID = e2.eventID)。

    WHERE 子句选择具有appID = 1 的根记录 与具有appID = 1 (e2.eventID IS NOT NULL) 的子项相关的根记录。

    Demo here

    【讨论】:

    • 非常感谢您的回答,它工作得很好。但我的问题比我这里的例子更复杂。我不能做LEFT JOIN events AS e2 ON e1.parentID = e2.eventID AND e1.appFK = 1,因为条件 appID 是一个变量,还会有其他条件,例如 environementID = 25 或 responsableID = 45,它们是用户动态选择的过滤器值。所以我必须在 LEFT JOIN 之后动态添加所有这些条件,这样会很复杂。
    • 我删除了LEFT JOIN 中的条件1.appFK = 1 并修改了类似WHERE e1.appFK = 1 AND (e1.parentID IS NULL OR e2.eventID IS NOT NULL) 的where 子句,它也可以工作。再次感谢。
    猜你喜欢
    • 2020-03-22
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多