我有一个多语言的应用程序,在那里菜单可以有不同的翻译。用户通过在语言表中设置级别来选择语言的首选项。菜单本身的顺序取决于MenuItem的级别。
我创建了一个选择记录的任务,首先在菜单级别(在菜单中获得正确的顺序),然后在语言级别(获得每个项目的正确级别)进行排序。但是现在我只想拥有每个菜单项的第一项(这将是最喜欢的语言)。
起初,我认为我可以使用不同的,但这是行不通的,因为不同的记录是不同的。我只希望返回特定菜单级别上的第一个菜单。
(如果需要的话,我在那些表示相同菜单项的菜单项之间也有一个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;
}编辑: MenuItem
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发布于 2014-04-27 17:45:58
下面是一种使用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)意味着两件非常不同的事情可能会导致混淆。
https://stackoverflow.com/questions/23325952
复制相似问题