多连接返回完全匹配(如果有)

时间:2013-10-21 20:41:25

标签: java sql

我有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。 但这真的很慢...... 我想知道是否可以用更少的查询来做到这一点。

0 个答案:

没有答案