2013-03-28 3 views
0

У меня есть ниже таблице: -вопрос в порядке по запросу

id name parent_id 
1 ABC 0 
2 XYZ 0 
3 BB 1 
4 AA 1 
5 PQR 0 

я хочу такой заказ по запросу, которые показывают такие результаты.

1 ABC 0 
4 AA 1 
3 BB 1 
5 PQR 0 
2 XYZ 0 

Проект родительского и дочернего проектов в порядке возрастания и родительского проекта, за которым следуют дочерние проекты.

Я использую такой запрос, но когда мы используем порядок по уровню, то (без восходящего) ok, но мне нужен уровень заказа с именем.

SELECT distinct `pp088_projects`.* , ( 
    SELECT LPAD(parent.id, 5, '0') 
     FROM `pp088_projects` parent 
     WHERE parent.id = `pp088_projects`.id 
     AND parent.parent_id = 0 
    UNION 
    SELECT CONCAT(LPAD(parent.id, 5, '0'), '.', LPAD(child.id, 5, '0')) 
     FROM `pp088_projects` parent 
     INNER JOIN `pp088_projects` child 
     ON (parent.id = child.parent_id) 
     WHERE child.id = `pp088_projects`.id 
     AND parent.parent_id = 0 
    UNION 
    SELECT CONCAT(LPAD(parent.id, 5, '0'), '.', LPAD(child.id, 5, '0'), '.', 
      LPAD(grandchild.id, 5, '0')) 
     FROM `pp088_projects` parent 
     INNER JOIN `pp088_projects` child ON (parent.id = child.parent_id) 
     INNER JOIN `pp088_projects` grandchild ON (child.id = grandchild.parent_id) 
     WHERE grandchild.id = `pp088_projects`.id AND parent.parent_id = 0) AS level 
    FROM `pp088_projects` , `pp088_project_users` 
    WHERE (`pp088_projects`.`id` = `pp088_project_users`.`project_id` 
    AND `pp088_project_users`.`user_id` = '1') 
    AND (`pp088_projects`.`completed_on` = '0000-00-00 00:00:00') 
    ORDER BY level 
+1

_ «Проблема в порядке по запросу» _ является очень плохим названием. Учтите, что люди должны иметь возможность искать ответ на свою аналогичную проблему. _ «Проблема» _ не является описанием вообще. –

+0

Это глубина сначала, правильно? – didierc

+0

@didierc да, первая глубина сортировка. –

ответ

1

Поскольку у вас есть только два уровня глубины, рекурсия (для которой MySQL имеет ограниченную поддержку) не требуется; вместо того, чтобы просто порядке id:

SELECT * 
FROM  pp088_projects 
ORDER BY IF(parent_id, parent_id, id), parent_id, id 

Посмотри на sqlfiddle.

Или, если вы хотите сделать заказ по имени:

SELECT  child.* 
FROM  pp088_projects child 
    LEFT JOIN pp088_projects parent ON child.parent_id = parent.id 
ORDER BY COALESCE(parent.name, child.name), parent.id, child.name 

Посмотри на sqlfiddle.

+0

Спасибо, босс, это очень помогает мне. Большое спасибо. –

Смежные вопросы