【问题标题】:Getting parental status from a self-referencing table从自引用表中获取父母身份
【发布时间】:2011-01-13 14:26:23
【问题描述】:

假设您有下表: 项目(item_id,item_parent) ...它是一个自引用表,因为 item_parent 引用 item_id。

您会使用哪些 MySQL 支持的 SQL 查询来选择表中的每个项目以及一个布尔值,该值指示该项目是否是父项目/是否有其他项目引用它?

如果表中有以下数据:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3          

...查询应该能够检索以下对象集:

{"item_id":1,"is_parent":0}
{"item_id":2,"is_parent":1}
{"item_id":3,"is_parent":1}
{"item_id":4,"is_parent":0}
{"item_id":5,"is_parent":0}

【问题讨论】:

    标签: mysql self-reference


    【解决方案1】:
    SELECT  i.item_id,
            item_id IN
            (
            SELECT  item_parent
            FROM    items
            )
    FROM    items i
    

    【讨论】:

    • 我喜欢 SQL,但它不会显示没有父项的项目,对吗?看起来 Emanuil 想从查询中取回所有项目,第二列是一个布尔值,显示其父母身份。
    • @AlCrowley:是的,它会显示所有项目,而不仅仅是那些有孩子的项目。 IN 谓词在 SELECT 子句中,而不是 WHERE
    【解决方案2】:

    这将返回所有项目和一个整数,指定每个项目有多少个孩子:

    SELECT T1.item_id, COUNT(T2.item_parent) AS is_parent
    FROM items AS T1
    LEFT JOIN items AS T2
    ON T1.item_id = T2.item_parent
    GROUP BY item_id
    

    如果您想要一个布尔值(0 或 1),只需将其更改为:

    SELECT T1.item_id, COUNT(T2.item_parent) > 0 AS is_parent
    FROM items AS T1
    LEFT JOIN items AS T2
    ON T1.item_id = T2.item_parent
    GROUP BY item_id
    

    【讨论】:

    • 太棒了!让孩子计数的查询是更好的事件。 SQL 太强大了。
    • 是的,您可能想要获取计数而不是布尔值,这是一个疯狂的猜测,这就是我建议这种方法的原因。我走运了! ;-)
    • 如果您只想要布尔值,请使用 Quassnois 解决方案,但如果您也想要孩子数,请使用此解决方案。
    • 我很幸运有这么好的答案。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多