2017-04-20 86 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