MySQL if条件然后左连接
我在页面底部有一个工作选择。正如你所看到的,它有53行,在我看来,这太多了。有人告诉我MySQL中有一个“如果”条件,但我无法使它工作。工作选择联合4选择,因为在每个选择中,我需要连接另一个表。是否可以根据表的内容连接表MySQL if条件然后左连接,mysql,Mysql,我在页面底部有一个工作选择。正如你所看到的,它有53行,在我看来,这太多了。有人告诉我MySQL中有一个“如果”条件,但我无法使它工作。工作选择联合4选择,因为在每个选择中,我需要连接另一个表。是否可以根据表的内容连接表 SELECT * FROM ( SELECT m.`identificator` , ml.id AS link_id, ml.parent, ml.type, ml.destination, ml.disabled, ml.order, ml
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语句对生成的“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
另一方面,我建议将其创建为一个过程,因为它只需要通过网络进行一次调用,并且您可以在该过程中执行所需的所有逻辑。我是否应该理解,您正在使用不同案例的并集来用备选方案的结果补充一个空案例?在这种情况下,选择备选方案ml.type的条件是什么?如果ml.type=页面/文章,我将加入cms\u post\u desc,如果cmscat cms\u category\u desc,如果shopcat shop\u category\u desc,如果ml.type=链接,这意味着目标中有直接链接,因此不需要留下任何链接