2009-08-14 61 views
1

我有以下功能与查询。它使用整数ID很好,但如果ID是varchar(ID:Xewi3adc),那么它不工作。以及我不知道如何使它工作,但我做了很多修改,但我无法得到它的工作。SQL复杂树行

DROP FUNCTION IF EXISTS album_tree_connect; 

DELIMITER $$ 

CREATE FUNCTION album_tree_connect(value varchar(32)) RETURNS INT 
NOT DETERMINISTIC 
READS SQL DATA 
BEGIN 
    DECLARE _id varchar(32); 
    DECLARE _parent varchar(32); 
    DECLARE _next INT; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL; 

    SET _parent = @id; 
    SET _id = -1; 

    IF @id IS NULL THEN 
     RETURN NULL; 
    END IF; 

    LOOP 
     SELECT MIN(album_id) 
     INTO @id 
     FROM album 
     WHERE sub_album_of_album_id = _parent 
      AND album_id > _id; 
     IF @id IS NOT NULL OR _parent = @start_with THEN 
      SET @level = @level + 1; 
      RETURN @id; 
     END IF; 
     SET @level := @level - 1; 
     SELECT album_id, sub_album_of_album_id 
     INTO _id, _parent 
     FROM album 
     WHERE album_id = _parent; 
    END LOOP; 
END 
$$ 

DELIMITER ; 


## select statement to pull the tree menu 

SELECT CONCAT(REPEAT(' ', level - 1), CAST(hi.album_id AS CHAR)) AS treeitem, sub_album_of_album_id, name, user_id, level 
FROM (
     SELECT album_tree_connect(album_id) AS id, @level AS level 
     FROM (
       SELECT @start_with := 0, 
         @id := @start_with, 
         @level := 0 
       ) vars, album 
     WHERE @id IS NOT NULL 
     ) ho 
JOIN album hi 
ON  hi.album_id = ho.id 
where user_id = 2 

回答

3

您的函数返回类型声明为INT,所以返回值将被强制为该类型。如果要返回的值(album_id字段)不是整数,则可能会发生错位。 http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

+0

我试过..但没有伤心地工作..你可以尝试它,并告诉我请..我可以给你快速的SQL转储,如果你想。 – Basit 2009-08-16 00:26:48

1

首先,解决您的函数声明为GApple建议:

CREATE FUNCTION album_tree_connect(value varchar(32)) RETURNS VARCHAR(32) 

其次,初始_id应该被初始化为emtpy字符串,而不是-1

SET _id = ''; 

三,你@start_with还应该用字符串(作为父节点标识符的字符串)进行初始化:

SELECT CONCAT(REPEAT(' ', level - 1), 
     CAST(hi.album_id AS CHAR)) AS treeitem, sub_album_of_album_id, name, user_id, level 
FROM (
     SELECT album_tree_connect(album_id) AS id, @level AS level 
     FROM (
       SELECT @start_with := '0', 

         --- The '0' above should be a string. 

         @id := @start_with, 
         @level := 0 
       ) vars, album 
     WHERE @id IS NOT NULL 
     ) ho 
JOIN album hi 
ON  hi.album_id = ho.id 

请注意,上述查询中user_id上的筛选器很可能不正确地工作。

您需要用换行功能为子查询:

SELECT * 
FROM (
     SELECT CONCAT(REPEAT(' ', level - 1), 
       CAST(hi.album_id AS CHAR)) AS treeitem, sub_album_of_album_id, name, user_id, level 
     FROM (
       SELECT album_tree_connect(album_id) AS id, @level AS level 
       FROM (
         SELECT @start_with := '0', 

           --- The '0' above should be a string. 

           @id := @start_with, 
           @level := 0 
         ) vars, album 
       WHERE @id IS NOT NULL 
       ) ho 
     JOIN album hi 
     ON  hi.album_id = ho.id 
     ) q 
WHERE user_id = 2 

或修改分层功能,把过滤器进入账户。