2013-04-22 2 views
0

나는이 게시물에 대해 여러 게시물을 알고 있지만 내 코드에서 제대로 작동하지 못했습니다.다른 데이터베이스의 두 테이블 조인

제목에서 알 수 있듯이 두 개의 서로 다른 DB의 두 테이블을 결합하고자합니다. 여기

내 코드입니다 : 내가 (. IE InterestedEntityId, 점수, 엔티티 Name) 한 번에 select 문에서 언급 된 3 개 필드를 얻으려면

$dbh1 = mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
    $dbh2 = mysql_connect("$host2", "$username2", "$password2", true)or die("cannot connect"); 
    mysql_select_db("$db_name", $dbh1)or die("cannot select DB"); 
    mysql_select_db("$db_name2", $dbh2)or die("cannot select DB"); 

//first table 
//$sql = mysql_query("SELECT InterestedEntityId, Score FROM users.`user_interests` WHERE UserId= //$userID ORDER BY Score DESC", $dbh1); 

//second table 
//$sql = mysql_query("SELECT entities.`Name` FROM tags.`entities` WHERE Id = InterestedEntityId", $dbh2); 

에 가입하는 방법에 대한 어떤 생각 하나의 SQL 쿼리에서 이러한 두 테이블. 내부 조인을 사용하고 tablename (this 스레드 제안)을 추가했지만 쿼리가 아무 것도 반환하지 않았습니다.

어떤 아이디어로주세요?

+0

당신은 당신의 사용자와 두 데이터베이스에 액세스 할 수있는 권한이와 전에 데이터베이스 이름을 추가해야합니다 테이블 이름. – KLK1

+0

물론 있습니다. 그 부분은 내 원본에 존재합니다 :) – Shane

답변

0

이와 비슷한 기능이 작동합니다.

SELECT t1.InterestedEntityId, t1.Score, t2.Name 
    FROM DB1.users.`user_interests` t1 
    JOIN DB2.tags.`entities` t2 ON t2.UserId = t1.Id 

참고 : mysql_ *은 (는) 사용되지 않으며 충분히 안전하지 않습니다.

0

Please, don't use mysql_* functions in new code. 그들은 더 이상 유지되지 않습니다 and are officially deprecated. red box을 보시겠습니까? prepared statements에 대해 자세히 알아보고 PDO 또는 MySQLi-this article을 사용하면 어떤 결정을 내리는 데 도움이됩니다. PDO를 선택하면 here is a good tutorial.


당신이 두 개의 서로 다른 서버에 액세스 한 것으로 나타났습니다 때문에 가능성이 작동하지 않을 수 있습니다 무엇을하려고 같은 서버에 두 개의 서로 다른 데이터베이스 에서 테이블을 조인하는 것이 이론적으로 가능하지만.

원하는 결과 세트를 얻으려면 수동으로 결합해야합니다.

예를 들어 (PDO를 사용하여) :

$dsn1 = "mysql:host=$host;dbname=$db_name"; 
$dsn2 = "mysql:host=$host2;dbname=$db_name2"; 

try { 
    // Create the connections 
    $db1 = new PDO($dsn1, $username, $password); 
    $db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db1->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $db1->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

    $db2 = new PDO($dsn2, $username2, $password2); 
    $db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db2->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $db2->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

    // Get the initial recordset 
    $sql1 = " 
     SELECT InterestedEntityId, Score 
     FROM `user_interests` 
     WHERE UserId = :userId 
     ORDER BY Score DESC 
    "; 
    $stmt1 = $db1->prepare($sql1); 
    $stmt1->bindParam('userId', $userID, PDO::PARAM_INT); 
    $stmt1->execute(); 

    // Prepare the statement for the second database 
    $sql2 = " 
     SELECT Name 
     FROM entities 
     WHERE Id = :entityId 
    "; 
    $entityId = 0; 
    $stmt2 = $db2->prepare($sql2); 
    $stmt2->bindParam('id', $entityId, PDO::PARAM_INT); 

    // Loop the first result set 
    $result = array(); 
    foreach ($stmt1 as $row1) { 
     // Fetch the related data from the second DB 
     $entityId = $row1['InterestedEntityId']; 
     $stmt2->execute(); 
     $row2 = $stmt2->fetch(); 

     // Construct the final result row and store it 
     $result[] = array(
      'InterestedEntityId' => $row1['InterestedEntityId'], 
      'Score' => $row1['Score'], 
      'Name' => $row2['Name'] 
     ); 
    } 
} catch(PDOException $e) { 
    die($e->getMessage()); 
} 

// The result set you want should now be available 
var_dump($result); 
+0

그 생각은하지만 그렇게하려면 이름을 가져온 다음 그 테이블의 모든 행을 추가해야합니다. 말할 필요도없이 낭비입니다. 너무 많은 시간이 걸립니다. – Shane

+0

@Shane 두 개의 서로 다른 데이터베이스 서버를 다루는 경우에는 문자 그대로 다른 방법이 없습니다. '$ host'와'$ host2'의 값이 항상 같을 경우 조인을 볼 수 있습니다. 그러나이 경우에는 두 개의 연결이 필요 없습니다. 코드가 제안하는 것처럼 두 개의 다른 서버를 다루는 경우 내 편집을 확인하십시오. – DaveRandom

+0

@Shane 그보다 더 빠른 방법이 있습니다 (예 : 스크립트가 하나의 테이블을 읽고 내용을 CSV에 저장 한 다음 LOAD TABLE ...을 사용하여 다른 DB에 넣음). – Kickstart

0

것은 꽤 많은 모델은 다음과 같습니다

SELECT dbName1.TableName1.ColumnName1, dbName2.TableName2.ColumnName2 FROM dbName1.TableName1 JOIN dbName2.TableName2 ON dbName1.TableName1.ColumnName1 = dbName2.TableName2.ColumnName2