1. SQL / Говнокод #13028

    −173

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS get_breadcrumbs$$
    CREATE PROCEDURE get_breadcrumbs(IN current_id BIGINT(20), show_home TINYINT(1))
    
        READS SQL DATA
    
        BEGIN
    
            DECLARE buff_id BIGINT(20);
            DECLARE buff_parent_id BIGINT(20);
    
            DECLARE done_search TINYINT(1);
            DECLARE current_depth BIGINT(20);
    
            SET done_search = 0;
            SET current_depth = 0;
            SET buff_id = NULL;
    
            CREATE TEMPORARY TABLE breadcrumbs (id BIGINT(20), depth BIGINT(20)) ENGINE = MEMORY;
    
            findloop : WHILE done_search = 0 DO
    
                SELECT id, parent_id INTO buff_id, buff_parent_id FROM documents WHERE id = current_id;
    
                IF buff_id IS NULL THEN
    
                    IF show_home != 0 THEN
    
                        SELECT id, parent_id INTO buff_id, buff_parent_id FROM documents WHERE alias = '/';
                        IF buff_id IS NOT NULL THEN
                            INSERT INTO breadcrumbs (id, depth) VALUES(buff_id, current_depth);
                        END IF;
    
                    END IF;
    
                    LEAVE findloop;
    
                END IF;
    
                INSERT INTO breadcrumbs (id, depth) VALUES(buff_id, current_depth);
    
                SET current_id = buff_parent_id;
                SET current_depth = current_depth + 1;
                SET buff_id = NULL;
    
            END WHILE findloop;
    
            SELECT
    
                d.id,
                d.parent_id,
                d.name,
                d.alias,
                b.depth
    
            FROM breadcrumbs b
            INNER JOIN documents d ON d.id = b.id
            ORDER BY b.depth DESC;
    
        END$$
    
    DELIMITER ;

    Хлебные крошки по id, parent_id.. Психанул...

    Запостил: deep, 20 Мая 2013

    Комментарии (5) RSS

    • На вид, как будто собирает глубину вложенности в parent-child иерархии...

      А такое же, но через WITH не сделать?
      Ответить
      • Цэ мускуль - он не умеет.
        Посему вот такая говнокожа..
        Ответить
    • А чего минусуют? Неуж то решение не полохо?
      Ответить
      • Сикель тяжело читабелен. И быстро понять в чем говнецо, без пристального вдумчивого чтения, не получится. Вот и минусуют...

        > Неуж то решение не полохо?
        А что там в мускуле есть альтернативного?
        Ответить

    Добавить комментарий