以下に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 を返します。しかし、これは本当に遅いです...より少ないクエリでこれを行うことができるかどうか疑問に思っていました.