GROUP BY时组内的操作

时间:2011-11-27 23:43:06

标签: mysql sql sqlite

的键由( 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”“жзи”

3 个答案:

答案 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