我有一个多语言应用程序,其中菜单可以有不同的翻译。用户通过在语言表中设置级别来选择语言的首选项。菜单本身的顺序由MenuItem的级别决定。
我创建了一个选择记录的任务,首先在菜单级别排序(在菜单中获得正确的顺序),然后在语言级别排序(以获得每个项目的正确级别)。但现在我只想拥有每个菜单项的第一项(这将是最喜欢的语言)。
最初我认为我可以使用distinct,但由于不同的记录不同,这在这种情况下不起作用。我只想让特定菜单级别的第一个返回。
(如果需要,我在这些菜单项之间也有一个commonId表示不同语言的相同菜单项(但实际上应该与使用级别相同)
有什么想法吗?
public List<MenuItem> findMenus(Long menuItem) throws Exception {
if(menuItem == null) menuItem = -1l;
SQLiteQueryBuilder _QB = new SQLiteQueryBuilder();
_QB.setTables("MenuItem m INNER JOIN Language l ON m.languageCode=l.code");
String[] rows = _fields.keySet().toArray(new String[0]);
for(int i = 0; i < rows.length; i++){
rows[i] = "m." + rows[i];
}
Cursor cursor = _QB.query(_db, rows, "m.parentId=? AND m.published=? AND l.enabled='1'", new String[] {String.valueOf(menuItem), String.valueOf(1)}, null, null, "m.level, l.level", null);
List<MenuItem> list = new ArrayList<MenuItem>(cursor.getCount());
if (cursor.moveToFirst()) {
do {
MenuItem item = getObject(cursor);
list.add(item);
} while (cursor.moveToNext());
}
cursor.close();
return list;
}
编辑: 菜单项
ID CommonId Level Lang
------------------------
1 6 1 EN
2 6 1 DE
3 6 1 IT
4 21 2 DE
5 21 2 IT
6 8 3 EN
7 4 4 EN
8 4 4 IT
What I would like as a result is
ID CommonId Level Lang
------------------------
1 6 1 EN
4 21 2 DE
6 8 3 EN
7 4 4 EN
This would be the result if the language would have the following order
Lang Level
----------
EN 1
DE 2
IT 3
答案 0 :(得分:1)
以下是使用not exists
的方法:
select mi.id, mi.commonid, mi.level, mi.lang
from MenuItem mi join
LangOrder lo
on mi.lang = lo.lang
where not exists (select 1
from MenuItem mi2 join
LangOrder lo2
on mi2.lang = lo.lang
where mi2.level = mi.level and
lo2.level < lo.level
);
我认为在两个不同的表格中使用相同的名称(level
)来表示两个截然不同的事情会导致混淆。