0

これについて複数の投稿があることは承知していますが、コードで機能させることができませんでした。

タイトルが示すように、2 つの異なる DB の 2 つのテーブルを結合したいと考えています。

これが私のコードです:

 $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);

selectステートメントで言及されている3つのフィールドを一度に取得したい(IE InterestedEntityId、Score、entities. Name)

これら 2 つのテーブルを 1 つの SQL クエリで結合する方法についてのアイデア。内部結合を使用してテーブル名を追加しようとしましたが (このスレッドが示唆しているように)、クエリは何も返しませんでした。

アイデアはありますか?

4

3 に答える 3

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_* は推奨されておらず、十分に安全ではないため、PDO を使用してください。

于 2013-04-22T14:15:39.747 に答える
0

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを決定するのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。


理論的には同じサーバー上の2 つの異なるデータベースのテーブルを結合することは可能ですが、2 つの異なるサーバーにアクセスしているように見えるため、実行しようとしていることが機能しない可能性があります。

必要な結果セットを取得するには、それらを手動で結合する必要があります。

例 (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);
于 2013-04-22T14:15:48.523 に答える