【问题标题】:PHP PDO MYSQL -> Query using PDO Class - Selecting Different Tables with same name fieldsPHP PDO MYSQL -> 使用 PDO 类查询 - 选择具有相同名称字段的不同表
【发布时间】:2017-09-17 10:58:47
【问题描述】:

我在 mysql 上有两个表,例如表上称为 worker,另一个称为 interventions

worker”表有 3 个字段:

  • 身份证
  • 姓名
  • 电子邮件

表格“interventions”也有 3 个字段:

  • 身份证
  • 姓名ID
  • 说明

我想在两个表之间交叉数据。 这是 PDO 类的代码:

    class PdoInsideClass {
    public  $ID, $Name , $NameId, $Description ;

    public function __construct() {
        $this->ID = "{$this->ID}";
        $this->Name = "{$this->Name}";
        $this->NameId = "{$this->NameId}";
        $this->Description = "{$this->Description}";
    }
}

数据库查询

$myquery = $database_connection->query( 'SELECT * FROM 
                                        worker, interventions
                                        WHERE worker.ID=interventions.NameId
                                        ');
$myquery->setFetchMode(PDO::FETCH_CLASS, 'PdoInsideClass');

表格和循环

<table>
    <tr>
        <th>ID of the Intervention</th>
        <th>Description Of the Job</th>
        <th>Id of the Worker</th>
        <th>Name of the Worker</th>
    </tr>   
    while ($result = $myquery->fetch()) {
        echo "<tr>"; //OPEN TABLE
        echo '<td>' . $result->ID . "</td>"; //ID of the Intervention
        echo '<td>' . $result->Description . "</td>"; //Description Of the Job
        echo '<td>' . $result->ID . "</td>"; //Id of the Worker
        echo '<td>' . $result->Name . "</td>"; //Name of the Worker
        echo "</tr>"; // CLOSE TABLE

    }
    ?>
</table>

问题:当我打印这个时,我得到两个相同的字段(干预的 ID 和工人的 ID);

问题是:我怎样才能选择我想要的表的ID?默认情况下,选择的 ID 是查询的第一个表——'SELECT * FROM worker, interventions'——在这种情况下是表工作者。

解决了我不想要的问题: 查询这个 -> $this-&gt;NameId = "{$this-&gt;NameId}"; 插入这个 -> $this-&gt;ID = "{$this-&gt;ID}";

我的目标是:我想知道是否可以查询具有相同名称的字段的不同表,并指定顺序而不是由我在查询中首先定义的顺序。

【问题讨论】:

  • 这里需要使用连接。用外键链接两个表
  • @Akin 他只是在循环使用连接,而不是明确使用INNER JOIN 关键字,而是在WHERE 子句上这样做。那也解决不了他的问题。

标签: php mysql database class pdo


【解决方案1】:

你有几种方法可以解决这个问题。

更改您的数据库架构

与其使用id 作为主键,不如将其命名为worker_idintervention_id,因为它的含义更明确,而不是隐含。

这现在可能不可行,但为了将来更好的数据库设计,请记住一些事情。

更改您的查询和别名列

而不是做

SELECT * FROM 
worker, interventions
WHERE worker.ID=interventions.NameId

根据需要显式定义列并为其设置别名

SELECT
    worker.id as worker_id,
    interventions.id as intervention_id
WHERE
    worker.ID=interventions.NameId

这可能是最简单的,因为它不需要更改数据库架构或更新所有查询,只需要您需要的那些。

按数组位置而不是名称访问

由于您有两列或多列同名,因此您正在用最近的列覆盖值,在这种情况下,干预上的 id 正在覆盖工人上的 id。

为了做到这一点,您需要进行一些更改。但是,我建议您这样做,因为每次您添加新列或更改列的顺序时,您的代码中断。

【讨论】:

  • 我认为这是最好的解决方案---更改您的查询和别名列---。有办法更新代码如: $result->TABLE_NAME->ID ? ||我想尽可能地重复使用代码。
  • 每次为列设置别名时,您的班级都需要了解这些列。根据您想要做的,我的第一个建议将解决问题,因为您永远不会遇到覆盖值的问题,因为理论上列将包含相同的值。
  • 有办法做这样的事情吗? $result->interventions->ID
  • 不,你不能那样做。
【解决方案2】:

更改您的查询以指定您想要的列的顺序:

SELECT worker.ID, worker.name, worker.email, 
  interventions.ID, interventions.nameid, interventions.description
FROM  worker, interventions
WHERE worker.ID=interventions.NameId

按你想要的顺序排列它们......

SELECT  worker.name, worker.email, interventions.description
  interventions.ID, interventions.nameid, worker.ID
FROM  worker, interventions
WHERE worker.ID=interventions.NameId

您甚至可以给它们一个新名称,以使它们在结果集中更容易识别(这称为别名)

SELECT  worker.name, worker.email, interventions.description
  interventions.ID as InterventionsID, interventions.nameid, 
  worker.ID as WorkerID
FROM  worker, interventions
WHERE worker.ID=interventions.NameId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多