在Android和SQLite中只获取特定有序记录集的一行

时间:2014-04-27 16:31:44

标签: android sql sqlite

我有一个多语言应用程序,其中菜单可以有不同的翻译。用户通过在语言表中设置级别来选择语言的首选项。菜单本身的顺序由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

1 个答案:

答案 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)来表示两个截然不同的事情会导致混淆。