我有一個mySQL表中的頁面的平面列表。排序單子列表,按父母排序
ID | Tab index | Page Name | parent
頁面可以是另一個頁面的兒童,由「父」屬性指定。
整個列表使用「Tab index」int列進行排序。
有人能想出一種方法來查詢此列表,以便
項目由TABINDEX有序
項目是另一個項目的孩子父項的後面進行分組,並下令他們的標籤(可選)?
我的mySQL知識並沒有達到那麼深。
這是一個現有的數據結構,不能更改。
在此先感謝您的任何意見。
我有一個mySQL表中的頁面的平面列表。排序單子列表,按父母排序
ID | Tab index | Page Name | parent
頁面可以是另一個頁面的兒童,由「父」屬性指定。
整個列表使用「Tab index」int列進行排序。
有人能想出一種方法來查詢此列表,以便
項目由TABINDEX有序
項目是另一個項目的孩子父項的後面進行分組,並下令他們的標籤(可選)?
我的mySQL知識並沒有達到那麼深。
這是一個現有的數據結構,不能更改。
在此先感謝您的任何意見。
假設列編號,頁面名,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」 的順序返回這些列:
這可讓您將子選項卡索引留空並讓它們從父項「繼承」。另外,如果您希望將默認排序值推送至底部,則可以使用(從頁面選擇max(tabindex)+ 1)替換0(合併中的第三個參數)。唯一需要注意的是,如果子tabindex大於下面的父項,則它將出現在列表的後面。
如果您的頁面只嵌套1級,則可以使用... ORDER BY CASE WHEN parent IS NULL THEN id ELSE parent END, parent, tab_id
。爲了達到與多層嵌套相同的結果,你需要遞歸查詢,這是MySQL不支持的。
這看起來不錯,我明天會試試看,並發表反饋意見。謝謝。 – 2009-11-20 03:12:50
如果我正確地忽略了這一點,您希望子項目在父項目後立即列出?還是可以將它們列在父代之後的任何位置,因爲它們是分組的日誌? – 2009-11-20 03:00:58