繁体   English   中英

MySQL,如果条件然后退出

[英]MySQL if condition then left join

我在页面底部有一个工作中的选择。 如您所见,它有53行,在我看来,这太多了。 有人告诉我MySQL中有一个'if'条件,但我无法使其工作。 工作中的Select unions 4选择,因为在每个选择中,我需要联接另一个表。 是否可以根据表的内容联接表?

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

我认为您需要使用动态SQL。 我的意思是,将您的最终SQL构建到一个临时变量中并执行它:

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

您的第一种情况可能是:

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变量。 此生成的查询应该与您在问题中发布的查询相同。 然后,您可以如上面在此答案中看到的那样运行它。

这是一个示例/想法,您必须完成它和/或检查它是否可以在您的模型中使用。

您可以只执行一个查询,并在其中查询每个左联接,然后使用IF语句对结果“子弹”列进行排序。 但是,这取决于要输出的内容以及其他表上是否有多个匹配行。

像这样的东西:

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM