首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android和SQLite中只获取一组特定有序记录的一行

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

Stack Overflow用户
提问于 2014-04-27 16:31:44
回答 1查看 64关注 0票数 0

我有一个多语言的应用程序,在那里菜单可以有不同的翻译。用户通过在语言表中设置级别来选择语言的首选项。菜单本身的顺序取决于MenuItem的级别。

我创建了一个选择记录的任务,首先在菜单级别(在菜单中获得正确的顺序),然后在语言级别(获得每个项目的正确级别)进行排序。但是现在我只想拥有每个菜单项的第一项(这将是最喜欢的语言)。

起初,我认为我可以使用不同的,但这是行不通的,因为不同的记录是不同的。我只希望返回特定菜单级别上的第一个菜单。

(如果需要的话,我在那些表示相同菜单项的菜单项之间也有一个commonId (但实际上应该与使用级别相同)

有什么想法吗?

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-27 17:45:58

下面是一种使用not exists的方法

代码语言:javascript
复制
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)意味着两件非常不同的事情可能会导致混淆。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23325952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档