更新:我用我生產的問題顯示的SQL查詢,但如果你想看到的另一種方法來此,歡迎您閱讀整個線程,使用SQL與UNIONmysql查詢連接:段或子節中的頁面,是否有更好的替代GROUP BY的替代方法?
我我已經做了實驗,並將結果集用於內容搜索,但我想確保它的性能是最好的。
我有一個命名的節表持有2個水平部分,即第1級(一個部分)和第2級(一個子段),在鄰接表模型
SECTIONS: id, parent_id, name
我查詢該表兩次以獲得列的排列
sec_id, sec_name, subsec_id, subsec_name
(這是這樣我就可以創建一個像/ SECTION_ID/subsection_id URI鏈接)
現在我加入一個單獨的名爲表頁面,其中一個頁面可與一節或第(兩者不能同時)通過現場SECTION_ID
-- columns to return
SELECT
s.id as section_id,
s.name as section_name,
ss.id as subsection_id,
ss.parent_id as subsection_parent_id,
ss.name as subsection_name,
p.section_id as page_section_id,
p.name as page_name
-- join SECTIONS into Sections and SubSections
FROM
(select id, name from sections where parent_id=0) as s
LEFT JOIN
(select id, parent_id, name from sections where parent_id!=0) as ss
ON
ss.parent_id = s.id
-- now join to PAGES table
JOIN
(select id, section_id, name from pages where active=1) as p
ON
(
p.section_id = s.id
OR
p.section_id = ss.id
)
-- need to use GROUP BY to eliminate duplicate pages
GROUP BY p.id
我得到的結果集中重複的網頁,所以我用GROUP BY pages.id以便移除重複的,但它會使性能稍微有點兒。
你能否提出一種更好的方法來消除重複?
我想過在SECTIONS連接中創建一個包含部分ID或子部分ID(取決於行的類型 - 部分或子部分)的列,然後使用它與PAGES section_id關聯,所以不會有重複的行,但我不知道如何去做。
感謝
您是否試圖檢索給定的頁面(節或子節)?換句話說,你的輸入是一個(部分或子部分)ID,不是嗎?對不起,我有點困惑,因爲在查詢中沒有看到WHERE子句。 – RandomSeed
尚無標準。我試圖從PAGES表中創建一組行,然後可以搜索其內容(當我在後面添加一個標準時)。我只是將我現在需要的列組裝到最終結果集中。謝謝 –
我以爲我可以創建一個視圖從這個搜索反對,但我剛剛學到了mysql不喜歡在FROM子句中使用派生表的視圖 - 即時學習:( –