MYSQL - 获取没有父项的对象,以及父项中最后创建的对象

时间:2015-01-18 02:09:34

标签: mysql

我的手上出了问题。 我们假设我有一个表格(名称页面),其字段为 ID PARENTID NAME CREATED_AT 。 PARENTID可以为NULL。 PARENTID和ID是相关的(外键),因此结构是父子,具有如下规则:如果条目具有父项,则它不能具有子项。 我需要一个查询,它将获得没有子节点的所有父条目(因此条件是PARENTID是空和(SELECT COUNT(ID)get_children_here)= 0),以及具有最新CREATED_AT日期时间的所有子条目,按CREATED_AT排序。

示例:

数据库条目是 - obj1,obj2,obj3,obj3.1,obj3.2,obj3.3,obj4,obj4.1,obj4.2,obj5。

条目obj3.1,obj3.2和obj3.3是条目obj3的子节点(因此它们的PARENTID = obj3.ID),条目obj4.1和obj4.2是条目obj4的子节点。

查询需要获取obj1,obj2,obj3.3,obj4.2和obj5(假设obj3.3和obj4.2在其父级中具有最新的CREATED_AT日期)。

我将如何做到这一点?

1 个答案:

答案 0 :(得分:0)

管理解决它。

这是我设置的表格:

enter image description here

所需的结果集按正确顺序排列:

obj5,obj3-2,obj2-1,obj1,obj4

查询:

SELECT * FROM
(
    SELECT c.*
    FROM contracts AS c
    WHERE (
        c.contract_id IS NULL
        AND (
            SELECT COUNT(id)
            FROM contracts AS c2
            WHERE c2.contract_id = c.id
        ) = 0
    )

    UNION ALL

    SELECT * FROM
    (
        SELECT c3.*
        FROM contracts AS c3
        WHERE contract_id IS NOT NULL
        ORDER BY created_at DESC
    ) contracts2
    GROUP BY contract_id

) AS contracts
ORDER BY created_at DESC