我在下面有 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 的对话。这应该是完全匹配的(用户列表中的用户数量应该与对话中的用户数量相匹配。
如果没有完全匹配,则应将 null 作为对话返回。
我希望以最快的方式(最少的查询)。
到目前为止,我尝试的是遍历每个用户的每个对话(在列表中),并且每次检查用户和对话之间的完全匹配匹配,如果我没有完全匹配,我会尝试下一个对话(循环循环)直到我找到我返回的一个。在 listUser 的迭代结束时,如果我没有找到任何我返回 null。但这真的很慢......我想知道是否可以用更少的查询来做到这一点。