2009-08-14 60 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 

或修改分層功能,把過濾器進入賬戶。