0

以下に3つのテーブルがあります(簡略化)

user |
------
id
name

conversation |
--------------
id
date_created

conversation_user|
------------------
conversation
user

私はArrayListこのメソッドに与えるユーザーのリストを持つ Java を持っています:

    public Conversation search(ArrayList<User> listUser) throws SQLException, Exception {

// build statement
        Statement st = DataBase.getInstance().createStatement();
        Conversation conversation = null;
        // build and execute query
        ResultSet rs;
        // loop throw the users
        for (User user : listUser) {
            rs = st.executeQuery("SELECT conversation FROM conversation_user WHERE user = " + user.getId());
            // loop throw conversations
            while (rs.next()) {
                int conversationId = rs.getInt("conversation");
                // loop on all user of this conversation
                ResultSet rs2 = st.executeQuery("SELECT user FROM conversation_user WHERE conversation = " + rs.getInt("conversation"));
                // loop on the user list
                boolean matchUser = true;
                int i = 0;
                while (rs2.next()) {
                    // check if there is a match
                    boolean isFound = false;
                    for (User u2 : listUser) {
                        if (rs2.getInt("user") == u2.getId()) {
                            isFound = true;
                            break;
                        }
                    }
                    if (!isFound) {
                        matchUser = false;
                        break;
                    }
                    i++;
                }
                if (!matchUser || listUser.size() != i) {
                    break;
                }
                return new Conversation(conversationId);
            }
        }
        return conversation;

    }  

指定されたユーザーのリストと会話内のユーザーのリストの間に一致が存在する場合、このメソッドが正しい ID を持つ会話を返すようにします。これは完全に一致する必要があります (user のリスト内のユーザー数は、会話内のユーザー数と一致する必要があります。

完全に一致するものがない場合は、会話として null を返す必要があります。

これを可能な限り最速の方法にしたいと思います(クエリの最小数)。

私がこれまでに試したことは、(リスト内の) 各ユーザーの各会話にループし、ユーザーと会話の間の完全一致の一致をチェックするたびに、完全に一致しない場合は次の会話を試すことです(ループでループ) 返すものを見つけるまで。そして、listUser の繰り返しの最後に、見つからなかった場合は null を返します。しかし、これは本当に遅いです...より少ないクエリでこれを行うことができるかどうか疑問に思っていました.

4

0 に答える 0