代码之家  ›  专栏  ›  技术社区  ›  rafaelmorais

使用递归mysql查询从父行到子行获取值

  •  0
  • rafaelmorais  · 技术社区  · 6 年前

    我想让父行中的值位于子行中,问题是每一行都有多个级别。如果我给你看就容易多了。

    以下是我所拥有的: enter image description here

    我想要一些像:

    id | question_id | text
    74 | 47          | Test answer
    75 | 47          | Another answer
    76 | 47          | Sub answer
    77 | 47          | Sub sub answer
    

    我想得到每个答案(行)的所有一级家长的列表。ID 77的顶级父项是75,75的问题ID是47,这正是我需要的。因为这样我就能计算出47号问题的总答案。

    我调查了一下,安尝试了以下代码:

    SELECT @pv:=id AS id, answered_at, parent 
    FROM qa_answers
    JOIN (SELECT @pv:=75) AS tmp
    WHERE parent = @pv
    

    但这只回75号身份证,我想给我看一切。关于如何实现这个目标有什么想法吗?我不是SQL专家。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Siva Rahul Sharma    6 年前

    我希望它能帮助你。

    表结构

    CREATE TABLE IF NOT EXISTS `products_t` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL,
      `parent_id` varchar(100) DEFAULT NULL,
      `sub_id` varchar(100) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    INSERT INTO `products_t` (`id`, `name`, `parent_id`, `sub_id`) VALUES
    (74, 'category15', '47', NULL),
    (75, 'category16', '47', NULL),
    (76, 'category19', NULL, '75'),
    (77, 'category20', NULL, '76'),
    (80, 'category80', NULL, '50'),
    (81, 'category81', '50', NULL);
    

    查询

    select  id,
            name,
            IFNULL(parent_id,'47' ) as parent_id
    from    (select * from products_t
             order by parent_id, id) products_sorted,
            (select @pv := '47') initialisation
    where   (find_in_set(parent_id, @pv) or find_in_set(sub_id, @pv) )
    and     length(@pv := concat(@pv, ',', id))
    

    在这里,@pv:='47'中指定的值应该设置为要选择其所有子代的父代的id。

    结果

    id  name        parent_id 
    74  category15  47
    75  category16  47
    76  category19  47
    77  category20  47