2017-04-20 84 views
1

我有两个表的mysql的IM,例如在表被称为工人,另一种被称为干预PHP MYSQL PDO - >使用PDO类查询 - 选择不同的表具有相同名称的字段

表 “工人” 有3个领域:

  • ID
  • 名称
  • 电子邮件

表 “干预” 有3个领域以及:

  • ID
  • 填充NameID
  • 说明

我想这两个表之间的交叉数据。 这里是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> 

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

问题是:如何选择我想要的表的ID?默认情况下,所选ID是查询的第一个表格 - 'SELECT * FROM worker, interventions' - 在这种情况下是表格工作者。

,我不是在寻找解决awesers: - 这个>$this->NameId = "{$this->NameId}"; insted的 - 查询这个>$this->ID = "{$this->ID}";

我的目标是:我想知道,如果它能够查询diferent表与具有相同名称的字段,并指定顺序,而不是由我在查询中首先放置的内容定义。

+0

您需要在这里使用连接。使用外键链接两个表 – Akintunde007

+0

@Akin他只是围绕一种方式使用连接,而不是明确使用“INNER JOIN”关键字,而是在'WHERE'子句中进行。那也不能解决他的问题。 – Augwa

回答

0

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

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 
1

你有解决这个的几种方法。

更改数据库架构

而不是使用id作为主键的,也许它命名为worker_idintervention_id因为它是更加明确它的意思,而不是在它隐含的意思。

这可能不是现在可行的,但是为了将来更好的数据库设计需要记住。

变化做

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

明确定义的列和别名它们作为neccessary

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

查询和别名列

不是这将是可能的最简单,因为它不需要更改数据库模式或更新所有数据库你的疑问,只是你需要的。

通过阵列的位置,而不是命名

既然你已经具有相同名称的两个或多个列的访问,您正在使用最新的一个标识上的干预措施覆盖的价值,在这种情况下是在工作人员上覆盖ID。

为了做到这一点,您需要这样做,它需要进行一些更改。我然而不是推荐这个,因为每次添加新列或更改列的顺序您的代码休息。

+0

我认为这是最好的解决方案---改变你的查询和别名列---。有办法更新代码像:$ result-> TABLE_NAME-> ID? ||我想尽可能地使用代码。 – bfaria

+0

每当您为课程别名时,您的课程都需要了解这些栏目。基于你想要做什么,我的第一个建议将解决这个问题,因为在理论上,你将永远不会有覆盖值的问题,因为列中将包含相同的值。 – Augwa

+0

有办法做这样的事情吗? $ result-> interventions-> ID – bfaria