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 的对话。这应该是完全匹配的(用户列表中的用户数量应该与对话中的用户数量相匹配。

如果没有完全匹配,则应将 null 作为对话返回。

我希望以最快的方式(最少的查询)。

到目前为止,我尝试的是遍历每个用户的每个对话(在列表中),并且每次检查用户和对话之间的完全匹配匹配,如果我没有完全匹配,我会尝试下一个对话(循环循环)直到我找到我返回的一个。在 listUser 的迭代结束时,如果我没有找到任何我返回 null。但这真的很慢......我想知道是否可以用更少的查询来做到这一点。

4

0 回答 0