2009-11-20 58 views
0

我有一個mySQL表中的頁面的平面列表。排序單子列表,按父母排序

ID | Tab index | Page Name | parent 

頁面可以是另一個頁面的兒童,由「父」屬性指定。

整個列表使用「Tab index」int列進行排序。

有人能想出一種方法來查詢此列表,以便

  • 項目由TABINDEX有序

  • 項目是另一個項目的孩子父項的後面進行分組,並下令他們的標籤(可選)?

我的mySQL知識並沒有達到那麼深。

這是一個現有的數據結構,不能更改。

在此先感謝您的任何意見。

+0

如果我正確地忽略了這一點,您希望子項目在父項目後立即列出?還是可以將它們列在父代之後的任何位置,因爲它們是分組的日誌? – 2009-11-20 03:00:58

回答

1

假設列編號,頁面名,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) 
; 

將在如下的第一非空值 「TI」 的順序返回這些列:

  1. 的tabindex
  2. 父母的tabindex

這可讓您將子選項卡索引留空並讓它們從父項「繼承」。另外,如果您希望將默認排序值推送至底部,則可以使用(從頁面選擇max(tabindex)+ 1)替換0(合併中的第三個參數)。唯一需要注意的是,如果子tabindex大於下面的父項,則它將出現在列表的後面。

0

如果您的頁面只嵌套1級,則可以使用... ORDER BY CASE WHEN parent IS NULL THEN id ELSE parent END, parent, tab_id。爲了達到與多層嵌套相同的結果,你需要遞歸查詢,這是MySQL不支持的。

+0

這看起來不錯,我明天會試試看,並發表反饋意見。謝謝。 – 2009-11-20 03:12:50