我正在创建一个多人游戏。语言网站。这是我的样本sql
select * from admin_real_estate_category_languages as category_languages left join admin_real_estate_categories as category on category_languages.real_estate_category_id = category.id where language = 'jp' and category = 'Area'
所有细节都有语言=' en'但并非所有人都有语言=' jp',如果语言=' jp'在详细信息中不存在我希望它查询语言=' en'。
简而言之,如果第一个where子句没有返回任何内容,我希望查询具有默认的where子句。
这是我的目标样本。
select * from admin_real_estate_category_languages as category_languages left join admin_real_estate_categories as category on category_languages.real_estate_category_id = category.id where language = 'jp' and category = 'Area' default where language = 'en' and category = 'Area'
谢谢:)
答案 0 :(得分:0)
您可以选择两者,按语言排序并限制为一个(以获得最佳匹配)。
WHERE language in ('jp', 'en') ORDER BY language DESC LIMIT 1
这假设只返回一个翻译资源。
如果有很多,你必须分组(或者只是获取所有并在你的应用程序代码中处理它)。
答案 1 :(得分:0)
如果您只有一种语言记录,则可以执行此操作:
select * from admin_real_estate_category_languages as category_languages
left join admin_real_estate_categories as category on category_languages.real_estate_category_id = category.id
where language IN('jp',' en') and category = 'Area'
或mysql
这个:
select * from admin_real_estate_category_languages as category_languages
left join admin_real_estate_categories as category on category_languages.real_estate_category_id = category.id
where (language = 'jp' or language = 'en') and category = 'Area'
答案 2 :(得分:0)
虽然这可能不是最佳解决方案,因为它引入了额外的连接,您可以通过这种方式解决问题。
首先,您可能不想做选择*,这通常是一个坏主意。选择您实际想要使用的列(即使这是所有列)。如果你有实际的列,你可以使用COALESCE来解决你的问题。
由于您还没有提供实际的架构,我在这里猜测一下,希望您能够获得解决方案的要点。另请注意,我已经在您的语言表和类别表中切换了位置,因此我加入了类别表上的语言表,而不是像在主要问题中那样。
SELECT category.foo,
category.bar,
category.baz,
COALESCE(category_language.text, default_category_language.text)
FROM admin_real_estate_categories AS category
LEFT JOIN admin_real_estate_category_languages AS category_language
ON category_language.real_estate_category_id = category.id
AND category_language.language = 'jp'
JOIN admin_real_estate_category_languages AS default_category_language
ON default_category_language .real_estate_category_id = category.id
AND default_category_language.language = 'en'
WHERE category.category = 'Area'
当然,如果您需要使用此类处理的太多色谱柱,这可能会迅速升级并失控。如果您只需要在一列或两列上进行此类处理,则此策略通常可以正常工作,但不止于此,您实际上不应该使用此策略。在这种情况下,我可能会拆分查询(只是确保不要意外地创建某种SELECT N + 1怪物,如果你这样做!)。