2009-11-20 8 views
0

J'ai une liste à plat de pages dans une table mySQL.Trier la liste à plat, groupe par les parents

ID | Tab index | Page Name | parent 

Les pages peuvent être des enfants d'une autre page, spécifiée par la propriété "parent".

La liste entière est triée en utilisant la colonne int "Tab index".

Quelqu'un peut-il penser à une façon d'interroger cette liste afin que

  • articles sont commandés par Tabindex

  • articles qui sont les enfants d'un autre élément sont regroupés derrière l'élément parent, et commandé par leurs tabindices (facultatif)?

Mes connaissances mySQL n'atteignent pas cette profondeur.

Cette structure de données existe et ne peut pas être modifiée.

Merci d'avance pour toute contribution.

+0

Si je comprends bien, vous souhaitez que les éléments enfants soient listés immédiatement après le parent? Ou est-il correct de les lister n'importe où après le parent, en tant que log comme ils sont groupés? –

Répondre

1

id colonnes En supposant, nom_de_page, tabindex, parent_id

select *, 
    coalesce(
     tabindex, 
     (select p2.tabindex from page as p2 where p2.id = p.parent_id limit 1), 
     0 
    ) as ti 
from page as p 
order by coalesce(ti, p.tabindex) 
; 

retourne les colonnes dans l'ordre "ti" qui est la première valeur non nulle de ce qui suit:

  1. tabindex
  2. le tabindex du parent

Cela vous permet de laisser les tabindexes enfants vides et de les faire "hériter" du parent. En outre, si vous voulez que la valeur de tri par défaut soit poussée vers le bas, vous pouvez remplacer le 0 (troisième arg en coalesce) par (sélectionnez max (tabindex) + 1 de la page). La seule mise en garde est que si un tabindex enfant est plus grand que le parent suivant, il apparaîtra plus tard dans la liste.

0

Si vos pages sont uniquement imbriquées 1 niveau de profondeur, vous pouvez faire ... ORDER BY CASE WHEN parent IS NULL THEN id ELSE parent END, parent, tab_id. Pour obtenir le même résultat avec plusieurs niveaux d'imbrication, vous avez besoin de requêtes récursives, pour lesquelles MySQL n'est pas compatible.

+0

Cela semble très bien, je vais essayer demain et poster des commentaires. Merci. –

Questions connexes