我想一次调用两个不同数据库的表。数据库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
答案 0 :(得分:2)
您可以使用FEDERATED Storage Engine。 FEDERATED存储引擎允许您从远程MySQL数据库访问数据,而无需使用复制或集群技术。查询本地FEDERATED表会自动从远程(联合)表中提取数据。没有数据存储在本地表中。这可能效率不高,但它会完成工作(JOINs)。
答案 1 :(得分: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
请记住,这可能会失败/工作错误,因为大多数数据库都限制了SQL IN
子句可以包含的项目数。此第二种方法可能允许在%a
替换上进行SQL注入。
答案 2 :(得分: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)
上述过程需要两个查询。