我有3张桌子(简化)
user |
------
id
name
conversation |
--------------
id
date_created
conversation_user|
------------------
conversation
user
我在Java中有ArrayList
,其中包含我为此方法提供的用户列表:
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的对话。 这应该是完全匹配(用户提供列表中的用户数应与对话中的用户数相匹配。
如果没有完全匹配,则应将null作为对话返回。
我希望尽可能以最快的方式(最少的查询数量)。
我到目前为止尝试的是循环到每个用户的每个对话(在列表中),并且每次检查用户和对话之间的完全匹配匹配,如果我没有完全匹配我尝试下一个对话(在循环中循环),直到我找到一个我返回的对话。并且在listUser的迭代结束时如果我没有找到任何i返回null。 但这真的很慢...... 我想知道是否可以用更少的查询来做到这一点。