【问题标题】:Single MySQL query for parent child table value sorting单次MySQL查询父子表值排序
【发布时间】:2014-11-06 06:58:31
【问题描述】:

我在显示特定父子值以及在该子值下显示所有子值作为关系时遇到问题。实际上我创建了单表“树”和三列 id,main(作为父)和 sub(作为子)。我创建了一个树关系船,但我不明白如何获取特定的父子和他的子以及他的子树值。

我想向他下面的 a4 父母展示他的孩子关系的意思(父母 a4 孩子 b3,b4,b5,b3 有 c1 和 c2,b4 有 c3 和 c4 和 c3 有 d1 和 d2 这样表值缩短出去)。有没有办法使用任何mysql查询来缩短表??? 如果您对此提供帮助。我会很高兴的。谢谢苏维克。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试下面:

    select * from TreeTable a where a.main = 'a4' Union select * from TreeTable  b where b.main in (select sub from TreeTable c where c.main = 'a4')
    

    1) 在脚本下面包含“C3”使用

    select * from TreeTable a where a.main = 'a4' and a.main = 'c3'  Union select * from TreeTable  b where b.main in (select sub from TreeTable c where c.main = 'a4' and c.main = 'c3' )
    

    2) 对于所有孩子:

     select * from TreeTable 
    

    【讨论】:

    • 感谢您的回复。但我有一些问题 1) c3 child 不包含在查询中。 2)有没有办法灵活这个命令,以便孩子号码和子孩子号码无关紧要......再次感谢您。
    • 1) 我更新了问题 2) 我更新了问题
    • 如果您还需要我的帮助,请告诉我。谢谢
    • 谢谢。您的 1) 答案我尝试过,但它不起作用。但我想知道是否有任何查询可以更轻松地做到这一点?但是如果我有更多的子子节点,则在子节点下和更多的子节点下添加。所以那件事我怎么能解决这个过程?实际上,我想知道如何编写这个简单的查询,无论父级添加了多少子步骤......请尽快回复。谢谢你提前。我正在寻找你的答案。
    【解决方案2】:

    如果我理解得很好,你想进行递归连接。

    使用 main 和 sub 列进行连接,可能是 3 个连接。

    抱歉,我现在没有用于测试的数据库。

    【讨论】:

      【解决方案3】:

      我已经在真实数据库上检查过它并且它有效 - 无论树有多大,该过程都应该让你得到所有的分支 - 我希望 :)

      DELIMITER $$
      
      CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `display_tree`()
      BEGIN
      
      SET @_query_text = "";
      
      DROP TEMPORARY TABLE IF EXISTS result_tree;
      DROP TEMPORARY TABLE IF EXISTS check_tbl;
      DROP TEMPORARY TABLE IF EXISTS iter_tree;
      
      CREATE TEMPORARY TABLE result_tree 
      SELECT DISTINCT 
          tree.main as name_level0,
          tree.sub as name_level1 
      FROM tree
          LEFT OUTER JOIN tree as level1_tree
              ON tree.sub = level1_tree.main
      WHERE 
          tree.main NOT IN (SELECT check_tree.sub FROM  tree as check_tree);
      
      CREATE TEMPORARY TABLE check_tbl 
      SELECT 
          result_tree.*
      FROM 
          result_tree
          LEFT OUTER JOIN tree
              ON tree.main = result_tree.name_level1
      WHERE NOT(ISNULL(tree.main));
      
      
      SET @current_level = 1;
      
      WHILE EXISTS(SELECT * FROM check_tbl) DO
      
          DROP TEMPORARY TABLE IF EXISTS iter_tree;
      
          CREATE TEMPORARY TABLE iter_tree 
          SELECT * FROM result_tree;
      
          DROP TEMPORARY TABLE result_tree;
      
          SET @last_level = @current_level;
          SET @current_level = @current_level + 1;
      
          SET @_query_text = CONCAT('CREATE TEMPORARY TABLE result_tree 
                                      SELECT 
                                          iter_tree.*, 
                                          tree.sub AS name_level', @current_level, '
                                      FROM 
                                          iter_tree
                                          LEFT OUTER JOIN tree
                                              ON tree.main = iter_tree.name_level', @last_level);
      
      -- SELECT @_query_text;
          PREPARE _query FROM @_query_text;
      
          EXECUTE _query;
      
          DEALLOCATE PREPARE _query;
      
          DROP TEMPORARY TABLE check_tbl;
      
          SET @_check_query_text = CONCAT('CREATE TEMPORARY TABLE check_tbl 
                                      SELECT 
                                          result_tree.*, 
                                          tree.sub AS name_level', (@current_level + 1), '
                                      FROM 
                                          result_tree
                                          LEFT OUTER JOIN tree
                                              ON tree.main = result_tree.name_level', @current_level, ' 
                                      WHERE NOT(ISNULL(tree.main))');
      
          PREPARE _check_query FROM @_check_query_text;
      
          EXECUTE _check_query;
      
          DEALLOCATE PREPARE _check_query;
      END WHILE;
      
      SELECT * FROM result_tree;
      
      END
      

      您可以使用以下方式运行它:

      CALL display_tree();
      

      希望对你有帮助。

      【讨论】:

      • 感谢您对我的帖子的回复。我是 mysql 的新手,所以如果您能多解释一下,那将对我更有帮助.. 实际上我希望在我的程序中使用它,我想无论子子步骤是什么,都选择任何值作为父项及其子项和子子项值。你能用简短的查询吗.....但是谢谢。
      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多