表项的键由( lang , id )组成。某些项目具有不同语言的翻译名称。我想创建这样一个查询,它将以给定的语言返回数据库中的所有项目,如果项目没有翻译以返回未翻译的值。
说我想要用保加利亚语写所有物品。这就是我被困住的地方:
SELECT lang, id, name
FROM items
WHERE lang = "bg" OR lang = "en"
GROUP BY id
如果有一个项目( 1 ,“en”)和一个项目( 1 , > “BG”)。 ids是一样的。那么MySQL或SQLite如何确定返回哪个结果?有什么方法我可以告诉它我宁愿返回( 1 ,“bg”)如果它存在但是如果它不存在( 1 ,“en”)会让我满意吗?
P.S。 为了进一步说明我想要的东西,让我们假设数据库包含以下带有模式的条目(id,lang,name):
( 1 ,“en”,“abc”)
( 2 ,“en”,“cde”)
( 3 ,“en”,“def”)
( 1 ,“bg”,“абв”)
( 3 ,“bg”,“жзи”)
执行保加利亚语所需的查询后,我应该:
( 1 ,“bg”,“абв”)
( 2 ,“en”,“cde”)
( 3 ,“bg”,“жзи”)
答案 0 :(得分:4)
如果“未翻译”的意思是“英语”或换句话说,基本语言是英语,您可以LEFT
将表连接到自身并使用COALESCE()
函数来摆脱{{1} }值
NULL
答案 1 :(得分:1)
标准SQL不允许您选择“分组依据”查询中的列,这些查询不会(1)按列表显示,或者(2)包含在聚合函数中。任何工业级SQL引擎(DB2,Oracle,SQL Server)都会认为您的查询不正确。
如果您需要选择特定项目或默认值不在数据库中时,则使用coalesce功能。有了这个功能,您应该能够在没有“分组依据”的情况下制定您的查询。
答案 2 :(得分:0)
您可以在多个列上执行GROUP BY
:
SELECT lang, id, name
FROM items
WHERE lang = "bg" OR lang = "en"
GROUP BY id, lang