2014-04-01 41 views
1

我有一個工作選擇在頁面的底部。正如你所看到的,它有53行,在我看來,這太多了。我被告知我在MySQL中有一個'如果'條件可用,但我無法使它工作。工作選擇聯盟4選擇,因爲在每個選擇,我需要加入另一個表。根據內容可以連接表嗎?MySQL如果條件然後離開加入

SELECT * 
FROM (
    SELECT m.`identificator` , ml.id AS link_id, ml.parent, ml.type, 
      ml.destination, ml.disabled, ml.order, mld.`name` AS link_name, 
      mld.`alt` , mld.`title` , cpd.`slug` 
    FROM `wf_menu` m 
    LEFT JOIN `wf_menu_link` ml ON m.`id` = ml.`menu_id` 
    LEFT JOIN `wf_menu_link_desc` mld ON ml.`id` = mld.`link_id` 
    LEFT JOIN `wf_cms_post_desc` cpd ON ml.destination = cpd.post_id 
    WHERE mld.`lang_id` =1 
    AND mld.`lang_id` = cpd.`lang_id` 
    AND (ml.`type` = 'page' 
    OR ml.`type` = 'article') 

    UNION 

    SELECT m.`identificator` , ml.id AS link_id, ml.parent, ml.type, 
      ml.destination, ml.disabled, ml.order, mld.`name` AS link_name, 
      mld.`alt` , mld.`title` , cpd.`slug` 
    FROM `wf_menu` m 
    LEFT JOIN `wf_menu_link` ml ON m.`id` = ml.`menu_id` 
    LEFT JOIN `wf_menu_link_desc` mld ON ml.`id` = mld.`link_id` 
    LEFT JOIN `wf_cms_category_desc` cpd ON ml.destination = cpd.category_id 
    WHERE mld.`lang_id` =1 
    AND mld.`lang_id` = cpd.`lang_id` 
    AND ml.`type` = 'cmscat' 

    UNION 

    SELECT m.`identificator` , ml.id AS link_id, ml.parent, ml.type, 
      ml.destination, ml.disabled, ml.order, mld.`name` AS link_name, 
      mld.`alt` , mld.`title` , spd.`slug` 
    FROM `wf_menu` m 
    LEFT JOIN `wf_menu_link` ml ON m.`id` = ml.`menu_id` 
    LEFT JOIN `wf_menu_link_desc` mld ON ml.`id` = mld.`link_id` 
    LEFT JOIN `wf_shop_category_desc` spd ON ml.destination = spd.category_id 
    WHERE mld.`lang_id` =1 
    AND mld.`lang_id` = spd.`lang_id` 
    AND ml.`type` = 'shopcat' 

    UNION 

    SELECT m.`identificator` , ml.id AS link_id, ml.parent, ml.type, 
      ml.destination, ml.disabled, ml.order, mld.`name` AS link_name, 
      mld.`alt` , mld.`title` , 'link' as slug 
    FROM `wf_menu` m 
    LEFT JOIN `wf_menu_link` ml ON m.`id` = ml.`menu_id` 
    LEFT JOIN `wf_menu_link_desc` mld ON ml.`id` = mld.`link_id` 
    WHERE mld.`lang_id` =1 
    AND ml.`type` = 'link' 

) a 
ORDER BY `order` DESC 
+0

在一個側面說明,我會建議創建它,而不是因爲它需要只是一個電話在網絡上,你可以做你需要的所有邏輯程序在程序中。 – llanato

+0

我是否應該明白,您正在使用不同情況的UNION來補充一個NULL情況並使用替代結果?在那種情況下,選擇替代ml.type的條件是什麼? –

+0

在ml.type = page/article的情況下,我離開加入cms_post_desc,如果是cmscat cms_category_desc,在shopcat shop_category_desc的情況下,如果ml.type = link,則意味着在目標中存在直接wroten鏈接,因此不需要左邊加入任何東西 –

回答

0

我想你需要使用動態SQL。我的意思是,建立你的最終SQL到一個臨時變量並執行它:

set @query = (SELECT ...); 
PREPARE st FROM @query; 
EXECUTE st; 

你的第一個案例coould是這樣的:

SET @query= (SELECT CONCAT(GROUP_CONCAT(CONCAT('SELECT m.`identificator` , ml.id AS link_id, ml.parent, ml.type, 
      ml.destination, ml.disabled, ml.order, mld.`name` AS link_name, 
      mld.`alt` , mld.`title` , cpd.`slug` FROM `wf_menu` m LEFT JOIN `wf_menu_link` ml ON m.`id` = ml.`menu_id` ', 
      CASE WHEN TTYPES.type='article' THEN 
       CONCAT('LEFT JOIN `wf_menu_link_desc` mld ON ml.`id` = mld.`link_id` LEFT JOIN `wf_cms_post_desc` cpd ON ml.destination = cpd.post_id WHERE mld.`lang_id` =1 AND mld.`lang_id` = cpd.`lang_id` AND (ml.`type` = \'page\' OR ml.`type` = \'',TTYPES.type,'\')') 

      END) 
SEPARATOR ' UNION '), ' SELECT NULL FROM wf_menu_link WHERE 1=2') FROM (SELECT DISTINCT wf_menu_link.`type` FROM wf_menu_link) TTYPES); 

(你可以完成耳提面命例)

運行該查詢將用生成的查詢填充@query變量。這個生成的查詢應該與您在問題中發佈的相同。然後你可以像上面在這個答案中看到的那樣運行它。

這是一個示例/想法,你必須完成它和/或檢查它在你的模型中的作品。

0

你可能只需要做一個查詢,每個左邊的連接就可以了,然後用IF語句對結果'slug'列進行分類。但是,這取決於您想要輸出的內容以及其他表上是否有多個匹配的行。

事情是這樣的: -

SELECT m.identificator , ml.id AS link_id, ml.parent, ml.type, 
     ml.destination, ml.disabled, ml.order, mld.name AS link_name, 
     mld.alt , mld.title , cpd.slug 
FROM wf_menu m 
LEFT JOIN wf_menu_link ml ON m.id = ml.menu_id 
LEFT JOIN wf_menu_link_desc mld ON ml.id = mld.link_id 
LEFT JOIN wf_cms_post_desc cpd ON ml.destination = cpd.post_id AND (ml.type = 'page' OR ml.type = 'article') 
LEFT JOIN wf_cms_category_desc cpd ON ml.destination = cpd.category_id AND ml.type = 'cmscat' AND mld.lang_id = cpd.lang_id 
LEFT JOIN wf_shop_category_desc spd ON ml.destination = spd.category_id AND ml.type = 'shopcat' AND mld.lang_id = spd.lang_id 
WHERE mld.lang_id =1 
AND mld.lang_id = cpd.lang_id