2

我想一次调用不同数据库的两个表。数据库 A 的表包含用户 ID,数据库 B 的表包含用户位置和用户 ID,所以我想加入这两个表并获取与 user_id.database A 对应的位置和 B 在两个不同的服务器中。那么我怎样才能加入这两个表。如果无法加入,是否有任何有效的方法可以做到这一点。请帮助。我正在尝试使用 java、mysql 来做到这一点。

 ps = con.prepareStatement("SELECT user_id FROM A.users");
 rs = ps.executeQuery();
 while(rs.next())
    {
    //call select statement for database B to get the location for each user id             

    }

请提出一种有效的方法来做到这一点

Id  User_id
===========
1   44
2   23

User_id     location
====================
44          india
23          us
4

3 回答 3

2

假设user_id是一个long

PreparedStatement psUserLocation = conB.prepareStatement("SELECT location FROM B.users WHERE user_id = ?");
while(rs.next()) {
    //call select statement for database B to get the location for each user id
    long userId = rs.getLong(user_id);
    psUserLocation.setLong(1, userId)
    ResultSet userLocation = ps.executeQuery();
    // Do whatever with the location(s)
}

编辑:对所有用户进行一次查询,而不是对每个用户进行一次查询:

private final static String QUERY = "SELECT user_id, location FROM B.users WHERE user_id IN (%a)";

StringBuilder userList = new StringBuilder();
while(rs.next()) {
    long userId = rs.getLong(user_id);
    userList.append(userId);
    if (!rs.isLast()) {
        userList.append(",");
    }
}

String usersLocationQuery = QUERY.replaceAll("%a", userList.toString());
PreparedStatement psUsersLocation = conB.prepareStatement(usersLocationQuery);
ResultSet usersLocation = psUsersLocation.executeQuery();
// Do whatever with the locations

IN请记住,这可能会失败/工作错误,因为大多数数据库对 SQL子句可以包含的项目数都有限制。此外,第二种方法可能允许对%a替换进行 SQL 注入。

于 2012-12-24T10:05:53.307 回答
2

您可以使用FEDERATED Storage Engine。FEDERATED 存储引擎允许您访问远程 MySQL 数据库中的数据,而无需使用复制或集群技术。查询本地 FEDERATED 表会自动从远程(联合)表中提取数据。本地表上不存储任何数据。这可能不是很有效,但它会完成工作(JOIN)。

于 2012-12-24T09:53:04.150 回答
1

如果可以取消连接,一种可能的方法是一次性从 tableA 中获取所有 user_id,然后将 user_id 一次性传递给 tableB。当然,这种方法也需要您更改代码。

就像是:

select user_id from tableA (of databaseA);

select user_id, location from tableB (of database B) where user_id in (<result_from_above_query)

上述过程将需要两个查询。

于 2012-12-24T10:23:11.717 回答