复合嵌套查询实例

来源:互联网 发布:软件信息服务业 编辑:程序博客网 时间:2024/05/16 10:57
/*SELECT contact.* t2.t1.history.*     FROM contact     INNER JOIN     (SELECT room_contact.contact t1.history.*     FROM     (SELECT room.Id, history.*     FROM room     INNER JOIN history     ON room.room_id = history.to_id     AND history.msg_key IN     (SELECT MAX(msg_key)     FROM history    GROUP BY to_id)) t1     INNER JOIN room_contact     ON t1.Id = room_contact.room) t2     ON contact.Id = t2.contact*/    public static List<Pair<List<Contact>, MessageHistory>> getSessionList() {        StringBuilder sqlBuilder0 = new StringBuilder();    sqlBuilder0.append(" SELECT MAX(msg_key) FROM history")    .append(" WHERE history.removed = 0 AND history.deleted = 0")    .append(" AND history.type <> 'READ_SECRET' AND history.type <> 'INFO'")    .append(" GROUP BY to_id");    Cursor cursor0 = SQLiteUtils.querySql(sqlBuilder0.toString());    SQLiteUtils.printCursor(cursor0);//    StringBuilder sqlBuilder1 = new StringBuilder();//    sqlBuilder1.append("SELECT room.Id, ")//    .append(SQLiteUtils.getColumNames4Select(MessageHistory.class))//    .append(" FROM room INNER JOIN history ON room.room_id = history.to_id")//    .append(" AND history.msg_key IN (SELECT MAX(msg_key) FROM history")//    .append(" WHERE history.removed = 0 AND history.deleted = 0")//    .append(" AND history.type <> 'READ_SECRET' AND history.type <> 'INFO'")//    .append(" GROUP BY to_id) GROUP BY history.to_id ")//    .append(" ORDER BY history.msg_key DESC, history.Id DESC");//    Cursor cursor1 = SQLiteUtils.querySql(sqlBuilder1.toString());//    SQLiteUtils.printCursor(cursor1);    StringBuilder sqlBuilder2 = new StringBuilder();    sqlBuilder2.append("SELECT room_contact.contact, ")    .append(SQLiteUtils.getColumNames4Select(MessageHistory.class, "t1"))    .append(" FROM (SELECT room.Id, ")    .append(SQLiteUtils.getColumNames4Select(MessageHistory.class))    .append(" FROM room INNER JOIN history ON room.room_id = history.to_id")    .append(" AND history.msg_key IN (SELECT MAX(msg_key) FROM history")    .append(" WHERE history.removed = 0 AND history.deleted = 0")    .append(" AND history.type <> 'READ_SECRET' AND history.type <> 'INFO'")    .append(" GROUP BY to_id) GROUP BY history.to_id ")    .append(" ORDER BY history.msg_key DESC, history.Id DESC)")    .append(" t1 LEFT JOIN room_contact")    .append(" ON t1.Id = room_contact.room");    Cursor cursor2 = SQLiteUtils.querySql(sqlBuilder2.toString());    SQLiteUtils.printCursor(cursor2);        StringBuilder sqlBuilder = new StringBuilder();    sqlBuilder.append("SELECT ")    .append(SQLiteUtils.getColumNames4Select(Contact.class)).append(',')    .append(SQLiteUtils.getColumNames4Select(MessageHistory.class, "t2"))    .append(" FROM contact INNER JOIN (SELECT room_contact.contact, ")    .append(SQLiteUtils.getColumNames4Select(MessageHistory.class, "t1"))    .append(" FROM (SELECT room.Id, ")    .append(SQLiteUtils.getColumNames4Select(MessageHistory.class))    .append(" FROM room INNER JOIN history ON room.room_id = history.to_id")    .append(" AND history.msg_key IN (SELECT MAX(msg_key) FROM history")    .append(" WHERE history.removed = 0 AND history.deleted = 0")    .append(" AND history.type <> 'READ_SECRET' AND history.type <> 'INFO'")    .append(" GROUP BY to_id) GROUP BY history.to_id ")    .append(" ORDER BY history.msg_key DESC, history.Id DESC)")    .append(" t1 INNER JOIN room_contact")    .append(" ON t1.Id = room_contact.room) t2 ON contact.Id = t2.contact");        Cursor cursor = SQLiteUtils.querySql(sqlBuilder.toString());    SQLiteUtils.printCursor(cursor);    List<Contact> contacts = SQLiteUtils.processCursor(Contact.class, cursor, null);    List<MessageHistory> messages = SQLiteUtils.processCursor(MessageHistory.class, cursor, "t2");    List<Pair<List<Contact>, MessageHistory>> pairs = new ArrayList<Pair<List<Contact>, MessageHistory>>();    List<MessageHistory> mList = new ArrayList<MessageHistory>();    int count = contacts.size();    for (int i = 0; i < count; i++) {    Contact contact = contacts.get(i);    MessageHistory msgHistory = messages.get(i);    if (mList.contains(msgHistory)) {int index = mList.indexOf(msgHistory);Pair<List<Contact>, MessageHistory> pair = pairs.get(index);List<Contact> cList = pair.first;cList.add(contact);} else {List<Contact> cList = new ArrayList<Contact>();cList.add(contact);mList.add(msgHistory);pairs.add(new Pair<List<Contact>, MessageHistory>(cList, msgHistory));}    }    return pairs;    }