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
4

1 に答える 1

1

深さは 2 レベルしかないため、再帰 (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で参照してください。

于 2013-03-28T10:19:25.910 に答える