2013-11-15 7 views
2

Im пытается заполнить список с данными из 3 таблиц с помощью join и одной таблицы, чтобы проверить, является ли пользователь частью группы. Но им не удается получить все группы для данного пользователя. Херес столы Group столSQLite select, join и where clause problems

_id | group_name | group_description | group_image 

стол пользователя

_id | user_name | user_image 

Группа участников таблице (эта таблица определяет, какие пользователи являются частью которых групп)

_id | user_id_foreign | group_id_foreign 

Activityobject стол

_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) }); 

В результате я получаю прямо сейчас все группы, которые имеют activityobject, но не те без. Я хотел бы получить все группы для данного пользователя, и если у группы есть объект-объект, я хочу получить данные от этого объекта.

Заранее благодарен!

EDIT: Изображение таблиц IM ссылается на enter image description here Heres моих заявлений вставки с данными в таблицах

//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)"); 

ответ

1

«Я хотел бы, чтобы все группы для данного пользователя, и если у группы есть объект 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; 

Если вы просто хотите, чтобы выбрать последний объект деятельности для каждой группы (если таковые имеются), вы можете добавить, что условия объединения, тоже:

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; 

Просто имейте в виду, что вы должны добавьте все критерии фильтрации для actionobjects к условию объединения левого соединения, а не к предложению where вашего основного запроса. В противном случае вы будете сужать строки из результата, где не может быть найден соответствующий объект actionobject, вместо заполнения столбцов нулями.

+0

Я обновил sql. Правильно ли это выглядит? Я просто попытался выбрать actionobject и присоединиться к остальным таблицам в этой таблице. Но это не имеет никакого значения в наборе результатов. Я по-прежнему получаю группы, у которых есть объект activity –

+0

. Я думаю, вам следует присоединиться к группам, пользователям и участникам (внутреннее соединение), а также к левому соединению по действиям и условию where, чтобы ограничить те, которые вы хотите показать. Я обновляю запрос за секунду. – Fabian

+0

Это теперь делает то, что вы хотите? – Fabian