2013-04-27 3 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, 

, так что я предполагаю, что они не должны быть включены

различия

Если я прочитать другие три запроса правильно с той лишь разницей в, где положение

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

Вы забыли добавить "pm_menu_groups г" в ЕКОМ;) К сожалению, он не работает ... Он присоединяется к каждой странице со всеми записями pm_menu :( – Andres7X

Смежные вопросы