SQL:默认where子句

时间:2014-08-19 05:56:59

标签: mysql sql sql-server

我正在创建一个多人游戏。语言网站。这是我的样本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'

谢谢:)

3 个答案:

答案 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怪物,如果你这样做!)。