【问题标题】:Need support with mySQL PDO JOIN statements需要 mySQL PDO JOIN 语句的支持
【发布时间】:2015-02-08 13:00:13
【问题描述】:

我需要一个带有 JOIN 的 SELECT,但目前不知道如何执行此操作。我已经阅读了一些教程,但对我的问题没有帮助。

我在 2 个数据库中有 2 个表:

DATABASE A

-> CONTENT
--> | PARTNERID | PAYSITE   |
--> | 1         | siteA.com |
--> | 2         | siteA.com |
--> | 3         | siteA.com |
--> | 3         | siteB.com |


DATABASE B

-> WMIDPP
--> | WMID | PARTNERID | PARTNERURL | PAYSITE   | ACTIVE
--> | 1    | 1         | AFFLINK 1  | siteA.com | 1
--> | 1    | 2         | AFFLINK 2  | siteA.com | 1
--> | 2    | 1         | AFFLINK 1  | siteA.com | 1

以上表格包含更多字段,但我需要使用这些字段。

如果我进入网站,我已经知道变量 $WMID 和 $PAYSITE。当我进入网站时,它应该只显示以下数据:

表 CONTENT 的完整数据和表 WMIDPP 中的字段 PARTNERURL 时

CONTENT.PARTNERID = WMIDPP.PARTNERID

and

WMIDPP.WMID = $WMID

and 

WMIDPP.PAYISTE = $PAYSITE

but only if

WMIDPP.ACTIVE = 1

谁能帮我解决我的问题?

提前致谢

托尔斯滕

编辑:

这里有更多关于数据库和表的信息:

表 CONTENT 位于 DATABASE A 中,表 WMIDPP 位于 DATABASE B 中。

我像这样访问这些数据库:

$DB_HOST  = "localhost";
$DB_NAME1 = "database1";
$DB_NAME2 = "database2";
$DB_USER  = "username";
$DB_PASS  = "password";
$OPTION   = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
try {
  $dbAS = new PDO("mysql:host=" . $DB_HOST . ";dbname=" . $DB_NAME1, $DB_USER, $DB_PASS, $OPTION);
  $dbEC = new PDO("mysql:host=" . $DB_HOST . ";dbname=" . $DB_NAME2, $DB_USER, $DB_PASS, $OPTION);
}
catch (PDOException $e) { exit("Verbindung fehlgeschlagen! " . $e->getMessage()); }

用户有权访问这两个数据库。

我有 2 个不同的数据库,因为有 2 个不同的项目。如果它不适用于这些配置,我可以将表从 DATABASE B 移动到 DATABASE A - 但这应该只是最坏的情况选项。我更喜欢将表的数据合并到 2 个不同数据库中的解决方案。

【问题讨论】:

  • 你知道“数据库”和“表”的区别吗?
  • 是的 - 你为什么问?
  • 删除了我输入的“测试查询”。那是应该允许你做任何事情的代码。它只是一个普通的“两表”连接,但指定了从哪些数据库中获取表。

标签: mysql select join pdo


【解决方案1】:

您使用一个 PDO 连接。

登录详细信息必须允许访问您要访问的两个数据库。

任何列的完整“路径”是:

<database name> . <table name> . <column name>.

这是连接来自两个独立数据库的表的经过测试的代码。

数据库 1) 被调用:'testmysql'

数据库 2) 被称为:'rags1'

它们只是我在这里设置的数据库,上面有类似的结构化表格。

连接来自不同数据库的两个表

/* --------------------------------------------------------------------
 *  Query testmysql and rags1
 */
$sqlTest = 'SELECT rags1.user.id as RagsRowId,
                   rags1.user.userid as RagsUserId,

                   testmysql.customer.id as TestRowId,
                   testmysql.customer.custid as TestCustId,
                   testmysql.customer.address as TestCustAddress

            FROM testmysql.customer
                 JOIN rags1.user
                    ON testmysql.customer.custid = rags1.user.userid
                   AND testmysql.customer.custid = :testCustId';

$stmt = $dbTest->prepare($sqlTest);
$stmt->bindValue(':testCustId', 'rfv123', PDO::PARAM_STR);
$stmt->execute();

$testResult = $stmt->fetchAll();
$stmt->closeCursor();
echo '<pre>';
print_r($testResult);
echo '<pre>';

连接详情:

/**
 * Two databases :
 *   1) testmysql
 *   2) rags1
 *
 *   Use the 'database' name that you want to refer to in the queries.
 */

/**
 * must have access rights to both db's
 */
// db connection to TestMysql and Rags1
$dsn = 'mysql:host=localhost;dbname=testmysql';
$username = 'rfv123';
$password = 'rfv123';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dbTest = new PDO($dsn, $username, $password, $options);
$dbTest->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

输出:

Array
(
    [0] => Array
        (
            [RagsRowId] => 1
            [0] => 1
            [RagsUserId] => rfv123
            [1] => rfv123
            [TestRowId] => 3
            [2] => 3
            [TestCustId] => rfv123
            [3] => rfv123
            [TestCustAddress] => 123 Somewhere Street, Cheshire
            [4] => 123 Somewhere Street, Cheshire
        )

)

【讨论】:

  • 哇...很多代码 ;-) 我试着理解它,并会玩一点...感谢您的支持。
  • 只是对两个独立数据库中的每一个的单独查询,以证明它们都可以从一个连接访问。最终查询只是两个表的正常连接,但来自不同的数据库。只看最后一个查询来做你想做的事。
  • 请注意,这假设数据库在同一连接上可用...但如果它们不是我不知道实现此目的的方法。
  • @prodigitalson,据我所知,您是正确的。快速的互联网搜索揭示了比“答案”更多的“问题”。 ;-/ 这在某种程度上是有道理的,因为查询可能会在处理之前将相当多的数据拉到“本地机器”。不太好。我怀疑需要设置从远程数据库到本地计算机的“选择性”复制 - 仔细?
  • @RyanVincent 你在这里连接到 1 个数据库(testmysql):“$dsn = 'mysql:host=localhost;dbname=testmysql';”但我不明白与第二个数据库的连接是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多