我手上有问题。
假设我有一个表(将其命名为页面),其中包含字段ID,PARENTID,NAME,CREATED_AT。
PARENTID可以为NULL。 PARENTID和ID是相关的(外键),因此结构为父子关系,规则是,如果条目具有父项,则不能有子项。
我需要一个查询,该查询将获取所有没有子项的父项(因此条件是PARENTID IS NULL AND(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日期)。
我将如何去做?
最佳答案
设法解决它。
这是我设置的表:
所需的结果集以正确的顺序排列:
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