2013-04-27 25 views
0

我有一個網站和一個相對的CMS,其中使用戶可以查看和編輯網站的頁面內容和信息多加入。每個頁面都與菜單語音相關聯,用戶可以通過該語音打開並查看該頁面。頁面和菜單分別存儲在pm_sections和pm_menu表中。當CMS用戶想要插入新頁面時,他必須指定相關菜單語音的所有者。有三個層次的歸屬:MySQL的 - 有相同的表和另一個表

-> menu group (1) 
    -> main menu voice (2), inside a menu group 
     -> secondary menu voice (3), inside a main menu voice 

在pm_menu表,關於屬於信息被存儲在「歸屬」列(值:1,2或3)和「menu_id」列(菜單語音屬於ID)。還有另一個表pm_menu_groups,它包含主菜單組。

我的問題是:我必須參加部分和菜單表,以列出CMS頁面編輯頁面信息。我試着用UNION子句來做到這一點:

SELECT s_id, section_name, menu_name, seo_title, last_edit 
FROM 
((SELECT s.id AS s_id, s.name AS section_name, s.content AS content, m.belonging AS belonging, m.menu_id AS menu_id, n.name AS menu_name, s.seo_title AS seo_title, s.added_by AS author, s.modify_date AS last_edit FROM pm_sections s, pm_menu m, pm_menu n 
WHERE m.section_id = s.id 
AND m.link IS NULL 
AND m.menu_id = n.id 
AND m.belonging = 3) 

UNION 

(SELECT s.id AS s_id, s.name AS section_name, s.content AS content, m.belonging AS belonging, m.menu_id AS menu_id, n.name AS menu_name, s.seo_title AS seo_title, s.added_by AS author, s.modify_date AS last_edit 
FROM pm_sections s, pm_menu m, pm_menu n 
WHERE m.section_id = s.id 
AND m.link IS NULL 
AND m.menu_id = n.id 
AND m.belonging = 2) 

UNION 

(SELECT s.id AS s_id, s.name AS section_name, s.content AS content, m.belonging AS belonging, m.menu_id AS menu_id, g.name AS menu_name, s.seo_title AS seo_title, s.added_by AS author, s.modify_date AS last_edit 
FROM pm_sections s, pm_menu m, pm_menu_groups g 
WHERE m.section_id = s.id 
AND m.link IS NULL 
AND m.menu_id = g.id 
AND m.belonging = 1)) 

AS belongings_table 
ORDER BY section_name 

我會問你,如果有可能用一個單一的查詢做...

回答

0

你外部查詢尋找以下字段不使用

s.added_by AS author, 
s.content AS content, 
m.belonging AS belonging, 
m.menu_id AS menu_id, 

,所以我想他們不需要被列入

差異

如果我讀取其他三個查詢正確的唯一區別是在where子句

AND m.menu_id = n.id 
AND m.belonging = 3 

AND m.menu_id = n.id 
AND m.belonging = 2 

AND m.menu_id = g.id 
AND m.belonging = 1 

這可以簡化爲

AND m.menu_id = n.id 
AND m.belonging in (2, 3) 

AND m.menu_id = g.id 
AND m.belonging = 1 

最後 並製作成正確的SQL(除非我有一或兩種)

SELECT 
    s.id AS s_id, 
    s.name AS section_name, 
    n.name AS menu_name, 
    s.seo_title AS seo_title, 
    s.modify_date AS last_edit 
FROM 
    pm_sections s, 
    pm_menu m, 
    pm_menu n, 
    pm_menu_groups g 
WHERE 
    m.section_id = s.id AND 
    m.link IS NULL AND 
    ( 
    (m.menu_id = n.id AND m.belonging In (2,3)) or 
    (m.menu_id = g.id AND m.belonging = 1) 
) 
+0

你忘了添加在FROM子句 「pm_menu_groups G」;) 不幸的是,它不工作...它加入所有pm_menu記錄:( – Andres7X 2013-04-27 14:12:53

相關問題