在mysql中选择针对特定id的所有子记录

时间:2015-01-06 13:22:40

标签: mysql

我在parent_id的任务表中有很多记录。 像

 task_id name parent
   1      a     0
   2      b     1
   3      c     2
   4      d     3
   5      e     0
   6      f     5

我的共享表中有task_id 1,因此我想选择它及其所有子记录直到第n级。 我有这个查询

SELECT 
    shared.task_id,tsk.* 
FROM 
    tbl_sharedtasks shared, tbl_tasks tsk 
WHERE 
    shared.user_id=1 AND tsk.task_id=shared.task_id.shared 

假设1

但是这只选择一条记录。问题是这应该选择First和task_id 1有一个子记录task_id 2和2有3个父对象,3有4个父对象。所以这些都应该选择所有与父母有关系的

2 个答案:

答案 0 :(得分:0)

MySQL不支持递归选择,但您可以在应用程序代码中执行更多查询,但是,如果您的任务表变大,这可能会导致性能问题。考虑改变你的设计。

答案 1 :(得分:0)

这是通过在Mysql中首先创建函数来完成的,如下所示

DROP FUNCTION `taskLevel`//
CREATE DEFINER=`root`@`localhost` FUNCTION `taskLevel`(GivenID  int(11)) RETURNS varchar(1024)    CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE lvl varchar(10);
DECLARE rv,q,queue,queue_children,front_id VARCHAR(1024);
DECLARE queue_length,pos INT;
SET rv = '';
SET queue = GivenID;
SET queue_length = 1;

WHILE queue_length > 0 DO
    SET front_id = queue;
    IF queue_length = 1 THEN
        SET queue = '';
    ELSE
        SET pos = LOCATE(',',queue) + 1;
        SET q = SUBSTR(queue,pos);
        SET queue = q;
    END IF;
    SET queue_length = queue_length - 1;

    SELECT IFNULL(qc,'') INTO queue_children
    FROM (SELECT GROUP_CONCAT(task_id) qc
    FROM tbl_tasks WHERE parent_id = front_id) A;

    IF LENGTH(queue_children) = 0 THEN
        IF LENGTH(queue) = 0 THEN
            SET queue_length = 0;
        END IF;
    ELSE
        IF LENGTH(rv) = 0 THEN
            SET rv = queue_children;
        ELSE
            SET rv = CONCAT(rv,',',queue_children);
        END IF;
        IF LENGTH(queue) = 0 THEN
            SET queue = queue_children;
        ELSE
            SET queue = CONCAT(queue,',',queue_children);
        END IF;
        SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1;
    END IF;
END WHILE;

RETURN rv;
END

SELECT  `task_id` ,  `title` , taskLevel(`task_id`) AS children FROM tbl_tasks WHERE  `task_id` =1