在Android和SQLite中只获取特定有序记录集的一行
我有一个多语言应用程序,其中的菜单可以有不同的翻译。用户通过在语言表中设置级别来选择语言的首选项。菜单本身的顺序由菜单项的级别决定 我创建了一个任务来选择记录,首先在菜单级别排序以获得菜单中的正确顺序,然后在语言级别排序以获得每个项目的正确级别。但现在我只想拥有每个菜单项的第一项,这将是具有最高偏好的语言 起初我认为我可以使用distinct,但在这种情况下不起作用,因为不同的记录是不同的。我只想返回特定菜单级别上的第一个 如果需要的话,我还可以在那些用不同语言表示相同菜单项的菜单项之间使用一个commonId,但实际上应该与使用level的结果相同 有什么想法吗在Android和SQLite中只获取特定有序记录集的一行,android,sql,sqlite,Android,Sql,Sqlite,我有一个多语言应用程序,其中的菜单可以有不同的翻译。用户通过在语言表中设置级别来选择语言的首选项。菜单本身的顺序由菜单项的级别决定 我创建了一个任务来选择记录,首先在菜单级别排序以获得菜单中的正确顺序,然后在语言级别排序以获得每个项目的正确级别。但现在我只想拥有每个菜单项的第一项,这将是具有最高偏好的语言 起初我认为我可以使用distinct,但在这种情况下不起作用,因为不同的记录是不同的。我只想返回特定菜单级别上的第一个 如果需要的话,我还可以在那些用不同语言表示相同菜单项的菜单项之间使用一个
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;
}
以下是一种使用“不存在”的方法:
我认为,在两个不同的表中使用相同的名称级别来表示两个非常不同的内容可能会导致混淆。因此,您希望执行以下操作:选择MaxLevel…是的,确实如此,并将其作为子查询或其他方式?我将为这个问题添加一个理论表格。这似乎是。。。超级团员!检查多列在线示例是否有一种简单的方法仅获取组中的第一列?例如,仅获取示例中“联邦配送”的第一项。在同一示例页面中尝试此复制粘贴:选择Employees.LastName,MaxOrders.OrderID作为来自订单的NumberOfOrders内部的JOIN EmployeeID=Employees.EmployeeID按LastName分组按NumberOfOrders描述按降序,如果要升序,删除描述
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
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
);