抽象:
我有一个希望满足的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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句