带条件WHERE子句的SQL SELECT

丹尼斯·艾希霍恩(Dennis Eichhorn):

抽象:

我有一个希望满足的WHERE条件的SELECT查询在某些情况下,无法满足此WHERE条件,在这种情况下,我想使用其他WHERE条件。那是我面临的抽象问题。这是一个更具体的示例:

例:

我有一张tag桌子和一张tag_l11n桌子。标签表包含有关标签的基本信息,该tag_l11n表包含标签的本地化名称。在以下简化的SELECT中,我要求使用英文名称(tag_l11n_language = 'en'的标签

查询:

SELECT 
    `tag_3`.`tag_id` as tag_id_3,
    `tag_l11n_2`.`tag_l11n_title` as tag_l11n_title_2
FROM 
    `tag` as tag_3 
LEFT JOIN 
    `tag_l11n` as tag_l11n_2 ON `tag_3`.`tag_id` = `tag_l11n_2`.`tag_l11n_tag` 
WHERE 
    `tag_l11n_2`.`tag_l11n_language` = 'en' 
ORDER BY 
    `tag_3`.`tag_id` ASC 
LIMIT 25;

问题:

如果标签没有特定的翻译,问题就开始了。例如,标签可以英语而不是意大利语存在。但是,意大利人也会接受英语(或任何其他语言)IFF(如果且仅当)意大利语翻译不存在的标签

最后,我希望有一个可以指定不同优先级的解决方案(1.用户本地化,2。英语,3。任何其他语言)。

我在这里有点茫然。尽管我可以轻松地省略条件(语言= ??)并在输出/表示过程中过滤结果,但我认为这不是可行的方法。

尼克:

您可以在子句中添加一个子句WHERE,使用NOT EXISTS子句,如果不存在意大利语翻译,该子句将返回英语翻译

WHERE 
    `tag_l11n_2`.`tag_l11n_language` = 'it' 
OR
    `tag_l11n_2`.`tag_l11n_language` = 'en'
    AND NOT EXISTS (SELECT *
                    FROM tag_l11n t3 
                    WHERE t3.tag_l11n_tag = tag_3.tag_id 
                      AND t3.tag_l11n_language = 'it')

另一个(可能更好的性能,赋予了它不会有一个OR条件)的解决办法是LEFT JOIN,以tag_l11n_2一次为所需的语言,一旦备份,并使用两次,COALESCE优先所需语言的结果是:

SELECT 
    `tag_3`.`tag_id` as tag_id_3,
    COALESCE(`tag_l11n_2`.`tag_l11n_title`, `tag_l11n_3`.`tag_l11n_title`) as tag_l11n_title_2
FROM 
    `tag` as tag_3 
LEFT JOIN 
    `tag_l11n` as tag_l11n_2 ON `tag_3`.`tag_id` = `tag_l11n_2`.`tag_l11n_tag` 
                            AND `tag_l11n_2`.`tag_l11n_language` = 'it' 
LEFT JOIN 
    `tag_l11n` as tag_l11n_3 ON `tag_3`.`tag_id` = `tag_l11n_3`.`tag_l11n_tag` 
                            AND `tag_l11n_3`.`tag_l11n_language` = 'en' 
ORDER BY 
    `tag_3`.`tag_id` ASC 
LIMIT 25;

请注意,可以通过在中添加LEFT JOIN和适当的列,将其扩展为所需的多种备份语言COALESCE

dbfiddle上的(两个查询的)演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章