简体   繁体   English

MySQL,如果条件然后退出

[英]MySQL if condition then left join

I have a working Select at the bottom of the page. 我在页面底部有一个工作中的选择。 As you can see, it has 53 lines and, in my opinion, this is too much. 如您所见,它有53行,在我看来,这太多了。 I have been told me that there is an 'if' condition available in MySQL, but I have not able to make it work. 有人告诉我MySQL中有一个'if'条件,但我无法使其工作。 The working Select unions 4 selects, because in each select, I need to join another table. 工作中的Select unions 4选择,因为在每个选择中,我需要联接另一个表。 Is it possible to join tables according to their content? 是否可以根据表的内容联接表?

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

I think you need to use Dynamic SQL. 我认为您需要使用动态SQL。 I mean, build your end SQL into a temporary variable and execute it: 我的意思是,将您的最终SQL构建到一个临时变量中并执行它:

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

Your first case coould be something like: 您的第一种情况可能是:

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);

(You can complete the remainding cases) (您可以完成剩余的案件)

Running that query will fill @query variable with a generated query. 运行该查询将使用生成的查询填充@query变量。 This generated query should be the same than you posted in your question. 此生成的查询应该与您在问题中发布的查询相同。 Then you can run it as you can see above in this answer. 然后,您可以如上面在此答案中看到的那样运行它。

This is an example/idea you have to complete it and/or check it works in your model. 这是一个示例/想法,您必须完成它和/或检查它是否可以在您的模型中使用。

You could possibly just do a single query, with each of the left joins in it, and sort out the resulting 'slug' column using IF statements. 您可以只执行一个查询,并在其中查询每个左联接,然后使用IF语句对结果“子弹”列进行排序。 However this depends on exactly what you want output, and whether there are multiple matching rows on the other tables. 但是,这取决于要输出的内容以及其他表上是否有多个匹配行。

Something like this:- 像这样的东西:

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