mysql加入条件
Posted
技术标签:
【中文标题】mysql加入条件【英文标题】:mysql join with condition 【发布时间】:2012-11-28 20:12:41 【问题描述】:我有两个具有这种结构的表
categories
--------------------------------
id | create
1 | 2012-12-01 12:00:00
2 | 2012-12-01 12:00:00
category_i18ns
--------------------------------
category_id | lang | title
1 | en | home page
1 | de | HomE PAGEa
1 | fa | خانه
2 | en | about
有些类别包含所有语言数据,有些类别包含其他数据。例如类别 id 2 只是有 en
翻译的标题。我想要一个查询,首先检查当前语言以获取检索标题,然后如果不存在则显示另一个。
我有一个查询来使用 i18n 数据获取当前类别数据
在当前示例中,de
是默认语言。对于类别 ID 1
,我们有 de
标题,但对于类别 2
,我们没有。所以我想要英文版作为类别的标题
SELECT * FROM `mhf_swe_ndzhmju3_test`.`categories` AS `Category`
LEFT JOIN `mhf_swe_ndzhmju3_test`.`category_i18ns` AS `CategoryLocale` ON (
`CategoryLocale`.`category_id` = `Category`.`id`
AND `CategoryLocale`.`lang` = 'de')
渴望输出'de'语言
Category.id CategoryLocale.title CategoryLocale.lang
1 HomE PAGEa de
2 about en
【问题讨论】:
如果您有en
和fa
用于第2 类但没有de
您必须选择哪种语言?
您能否正确提及您期望的输出?
@HamletHakobyan 不重要。首先是mysql serverd
添加了期望输出。请检查并建议查询。 ty
【参考方案1】:
SELECT Category.id,
COALESCE(a.lang, b.lang) lang,
COALESCE(a.title, b.title) title
FROM categories AS Category
LEFT JOIN category_i18ns AS a
ON a.category_id = Category.id AND a.lang = 'de'
LEFT JOIN category_i18ns AS b
ON b.category_id = Category.id AND b.lang = 'en'
SQLFiddle Demo
【讨论】:
如果我们不知道将哪种语言添加到特殊类别中?我怎样才能找回它们。例如类别 id 3 仅通过fr
语言添加并且没有任何其他语言
您不是在假设您在所有类别中都会有en
的条目吗?
@sub_stantial nope .. 所有类别都没有主要的默认语言。
@sweb :是的,我同意。无论如何,我的问题是给 Kuya John 的。
请问大家有什么疑问:D【参考方案2】:
如果您有优先顺序, left 加入所有语言并按优先顺序将它们合并:
SELECT Category.id,
COALESCE(a.lang, b.lang, c.lang, d.lang) lang,
COALESCE(a.title, b.title, c.title, d.title) title
FROM categories AS Category
LEFT JOIN category_i18ns AS a
ON a.category_id = Category.id AND a.lang = 'de'
LEFT JOIN category_i18ns AS b
ON b.category_id = Category.id AND b.lang = 'en'
LEFT JOIN category_i18ns AS c
ON c.category_id = Category.id AND c.lang = 'fr'
LEFT JOIN category_i18ns AS d
ON d.category_id = Category.id AND d.lang = 'es';
如果您想从随机语言中获取文本,请使用以下查询:
SELECT Category.id,
COALESCE(a.lang, b.lang) lang,
COALESCE(a.title, b.title) title
FROM categories AS Category
LEFT JOIN category_i18ns AS a
ON a.category_id = Category.id AND a.lang = 'de'
LEFT JOIN category_i18ns AS b
ON b.category_id = Category.id
GROUP BY Category.id
http://sqlfiddle.com/#!2/2beaf/5
【讨论】:
【参考方案3】:好的,这不是最好的解决方案,但我认为应该可以正常工作:
SELECT * FROM categories c INNER JOIN category_i18ns t1
ON c.id = t1.category_id AND t1.lang = 'de'
UNION
SELECT * FROM categories c LEFT JOIN category_i18ns t2
ON c.id = t2.category_id and t2.lang != 'de'
WHERE t2.category_id not in
(SELECT DISTINCT category_id FROM category_i18ns WHERE lang = 'de')
GROUP BY c.id
SQL Fiddle Example
【讨论】:
以上是关于mysql加入条件的主要内容,如果未能解决你的问题,请参考以下文章