java - SQLite select、join 和 where 子句问题

标签 java android sql sqlite

我正在尝试使用 join 使用来自 3 个表的数据填充 ListView ,并使用一个表来检查用户是否属于某个组。但是我无法获取给定用户的所有组。这是表格 组表

_id | group_name | group_description | group_image

用户表

_id | user_name | user_image

组参与者表(此表确定哪些用户属于哪些组)

_id | user_id_foreign | group_id_foreign

Activity 对象表

_id | target_id | user_id_foreign | target_type | time | type

这是我试图开始工作的 sql 语句:

Cursor c = database
            .rawQuery(
                    "SELECT groups.*, activityobject.time, activityobject.type, user.user_name, user.user_image "
                            + "FROM activityobject "
                            + "JOIN user "
                            + "ON user._id = activityobject.user_id "
                            + "JOIN groups"
                            + "ON groups._id = activityobject.target_id "
                            + "WHERE groups._id IN(SELECT group_id_foreign FROM group_participants WHERE user_id_foreign = ?)"
                            + "AND activityobject.target_type = 0 "
                            + "GROUP BY groups._id "
                            + "ORDER BY activityobject._id",
                    new String[] { String.valueOf(userId) });

我现在得到的结果是所有有 Activity 对象的组,而不是没有 Activity 对象的组。 我想获取给定用户的所有组,如果一个组有一个 Activity 对象,我也想从该对象中获取数据。

提前致谢!

编辑: 我所指的表格的图像 enter image description here 这是我的插入语句,其中包含表中的数据

//Activity object table
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (1, 2, 1, 1, 'Alex gruppe', 0, '07-05-13', 1)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (2, 2, 1, 2, 'Jeremys gruppe', 0, '08-06-13', 2)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (3, 2, 1, 2, 'Jeremys gruppe', 1, '09-07-13',3)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (4, 2, 1, 2, 'Jeremys gruppe', 0, '10-08-13', 4)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (5, 2, 1, 1, 'Alex gruppe', 0, '11-09-13', 5)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (6, 2, 1, 1, 'Alex gruppe', 0, '12-10-13', 6)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (7, 2, 1, 1, 'Alex gruppe', 1, '13-11-13', 7)");
    db.execSQL("INSERT INTO " + TABLE_ACTIVITYOBJECT + " ("
            + KEY_ACTIVITYOBJECT_ID + ", "
            + KEY_ACTIVITYOBJECT_ACTIVITY_TYPE + ", "
            + KEY_ACTIVITYOBJECT_USER_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_ID + ", "
            + KEY_ACTIVITYOBJECT_TARGET_NAME + ", "
            + KEY_ACTIVITYOBJECT_TARGET_TYPE + ", "
            + KEY_ACTIVITYOBJECT_TIME + ", " + KEY_ACTIVITYOBJECT_OBJECT_ID
            + ") VALUES (8, 2, 1, 1, 'Alex gruppe', 0, '14-12-13', 8)");
    // Group table
    db.execSQL("INSERT INTO " + TABLE_GROUP + " ( " + KEY_GROUP_ID + ", "
            + KEY_GROUP_NAME + ", " + KEY_GROUP_INFO + ", "
            + KEY_GROUP_IMAGE
            + ") VALUES (1,'alex gruppe', 'mega awesome gruppe', null);");
    db.execSQL("INSERT INTO " + TABLE_GROUP + " ( " + KEY_GROUP_ID + ", "
            + KEY_GROUP_NAME + ", " + KEY_GROUP_INFO + ", "
            + KEY_GROUP_IMAGE
            + ") VALUES (2,'jeremy gruppe', 'mega awesome gruppe', null);");
    db.execSQL("INSERT INTO " + TABLE_GROUP + " ( " + KEY_GROUP_ID + ", "
            + KEY_GROUP_NAME + ", " + KEY_GROUP_INFO + ", "
            + KEY_GROUP_IMAGE
            + ") VALUES (3,'ole gruppe', 'mega awesome gruppe', null);");
    db.execSQL("INSERT INTO " + TABLE_GROUP + " ( " + KEY_GROUP_ID + ", "
            + KEY_GROUP_NAME + ", " + KEY_GROUP_INFO + ", "
            + KEY_GROUP_IMAGE
            + ") VALUES (4,'egon gruppe', 'mega awesome gruppe', null);");
    // User table
    db.execSQL("INSERT INTO " + TABLE_USER + " (" + KEY_USER_ID + ", "
            + KEY_USER_NAME + ", " + KEY_USER_IMAGE + ", "
            + KEY_USER_STATUS + ") VALUES (1, 'Alex', null, 0)");
    db.execSQL("INSERT INTO " + TABLE_USER + " (" + KEY_USER_ID + ", "
            + KEY_USER_NAME + ", " + KEY_USER_IMAGE + ", "
            + KEY_USER_STATUS + ") VALUES (2, 'Peter', null, 0)");
    db.execSQL("INSERT INTO " + TABLE_USER + " (" + KEY_USER_ID + ", "
            + KEY_USER_NAME + ", " + KEY_USER_IMAGE + ", "
            + KEY_USER_STATUS + ") VALUES (3, 'Jeremy', null, 0)");
    db.execSQL("INSERT INTO " + TABLE_USER + " (" + KEY_USER_ID + ", "
            + KEY_USER_NAME + ", " + KEY_USER_IMAGE + ", "
            + KEY_USER_STATUS + ") VALUES (4, 'Søren', null, 0)");
    db.execSQL("INSERT INTO " + TABLE_USER + " (" + KEY_USER_ID + ", "
            + KEY_USER_NAME + ", " + KEY_USER_IMAGE + ", "
            + KEY_USER_STATUS + ") VALUES (5, 'Ole', null, 0)");

    // Group participants table
    db.execSQL("INSERT INTO " + TABLE_GROUP_PARTICIPANTS + " ( "
            + KEY_GROUP_PARTICIPANTS_ID + ", "
            + KEY_GROUP_PARTICIPANTS_USER_ID_FOREIGN + ", "
            + KEY_GROUP_PARTICIPANTS_GROUP_ID_FOREIGN + ") VALUES(1, 1, 1)");
    db.execSQL("INSERT INTO " + TABLE_GROUP_PARTICIPANTS + " ( "
            + KEY_GROUP_PARTICIPANTS_ID + ", "
            + KEY_GROUP_PARTICIPANTS_USER_ID_FOREIGN + ", "
            + KEY_GROUP_PARTICIPANTS_GROUP_ID_FOREIGN + ") VALUES(2, 1, 4)");
    db.execSQL("INSERT INTO " + TABLE_GROUP_PARTICIPANTS + " ( "
            + KEY_GROUP_PARTICIPANTS_ID + ", "
            + KEY_GROUP_PARTICIPANTS_USER_ID_FOREIGN + ", "
            + KEY_GROUP_PARTICIPANTS_GROUP_ID_FOREIGN + ") VALUES(3, 2, 2)");

最佳答案

“我想获取给定用户的所有组,如果一个组有一个 Activity 对象,我也想从该对象中获取数据。”

然后您必须使用 LEFT JOIN。

select g.*, a.time, a.type, u.user_name, u.user_image                             
from groups g
    join group_participants gp on gp.group_id_foreign = g._id
    left join activityobject a on g._id = a.target_id and a.target_type = 0
    left join user u on a.user_id_foreign = u.id
where gp.user_id_foreign = ?
order by a._id;

如果您只想选择每个组的最后一个 Activity 对象(如果有的话),您也可以将其添加到连接条件中:

select g.*, a.*
from groups g
    join group_participants gp on gp.group_id_foreign = g._id
    left join activityobject a 
        on g._id = a.target_id and 
           a.target_type = 0 and 
           a._id in (select max(_id) from activityobject group by target_id)  
    left join users u on a.user_id_foreign = u.id
where gp.user_id_foreign = ?
order by a._id;

请记住,您必须将 Activity 对象的所有过滤条件添加到左连接的连接条件中,而不是添加到主查询的 where 子句中。否则,您将从结果中隐藏找不到匹配的 Activity 对象的行,而不是用空值填充列。

关于java - SQLite select、join 和 where 子句问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20002305/

相关文章:

java实时设计rtsj

Android 和 libCurl https

java - 无法加载类 'com.google.gson.JsonObject'

python - sqlalchemy `sum`、 `average`、 `min`、 `max` 的简单示例

java - 如何在 java 中映射 TYPE TABLE OF VARCHAR2(5)?

java - 使用 ssh 工具导入包后找不到符号

java - 哪个支付系统与Java集成度好?

java - Android 可以执行 Activity 的方法

c# - 从 xpath 创建 SQL 数据库结构

sql - 在同一条语句中合并和 Concat,Postgres