簡體   English   中英

在 mysql 中命名外鍵

[英]alaising a foreign key in mysql

假設我有兩個表contactsdepartments

表格內容如下:

聯系人:

id |  first_name | last_name | email            | department_id
10 |  Mani       | Raj       | raj@mail.com     | 2
11 |  Santhos    | Sam       | santhos@mail.com | 3

部門:

id | department_name
1  | HR
2  | Sales
3  | Finance

我正在嘗試使用INNER JOIN打印表的詳細信息

我的查詢是:

$sql_query = "SELECT * FROM contacts INNER JOIN departments, departments.id as departments.department_id ON contacts.department_id=departments.department_id ORDE`R BY contacts.id";

我已經提到了下面的問題: SQL exclude a column using SELECT * [except columnA] FROM tableA?

但我不想創建臨時表。

我在想可能有一種方法可以從部門表中刪除 id 列。

添加

我可以使用查詢從表中打印元素:

$sql_query = "SELECT * FROM $table_name INNER JOIN departments ON $table_name.department_id=departments.department_id ORDER BY $table_name.id";

它的偉大工程,但問題是,當我嘗試打印我的網頁上的詳細信息,不知何故的idcontacts表由overwitten iddepartments表。

我用來打印表格的代碼是:

if ($query_result->num_rows > 0) {
            ?>
            <table>
                <tr>
                    <th>ID</th>
                    <th> First Name </th>
                    <th> Last Name </th>
                    <th>E-mail</th>
                    <th>Department</th>
                </tr>
                <?php
                while($row = $query_result->fetch_assoc()) {
                    ?>
                    <tr>
                        <td> <?php echo $row["id"]; ?> </td>
                        <td> <?php echo $row["first_name"]; ?> </td>
                        <td> <?php echo $row["last_name"]; ?> </td>
                        <td> <?php echo $row["email"]; ?> </td>
                        <td> <?php echo $row["department_name"]; ?> </td>
                    </tr>
                    <?php
                }
                ?>
            </table>
            <?php           
        }

這段代碼的輸出是:

ID | First Name | Last Name     | E-mail            | Department
2  | Mani       | Raj           | mani@mail.com     | Sales
8  | Santhos    | Sam           | santhos@mail.com  | Finance

而我的輸出應該是:

ID | First Name | Last Name     | E-mail            | Department
10 | Mani       | Raj           | mani@mail.com     | Sales
11 | Santhos    | Sam           | santhos@mail.com  | Finance

現在我將如何在不被覆蓋的情況下打印值?

我是新手。 請幫我...

編輯

好的,這很酷

$sql_query = "SELECT *, contacts.id as id FROM contacts INNER JOIN departments 
ON contacts.department_id=departments.department_id ORDER BY contacts.id";

但我也在嘗試將詳細信息導出到 .xls 文件。 我在那里遇到錯誤!!

這是我的錯誤

You have an error in your SQL syntax     check the manual that corresponds to your MariaDB server version for the right syntax to use near 'as id FROM  INNER JOIN departments ON .department_id=departments.id ORDER BY .id' at line 1<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/opt/lampp/htdocs/contacts/export.php</b> on line <b>23</b><br />    

我的代碼是:

$flag = false;
foreach($query_result as $row) {
    if(!$flag) {
        // display field/column names as first row
        echo implode("\t", array_keys($row)) . "\r\n";
        $flag = true;
    }
    array_walk($row, __NAMESPACE__ . '\cleanData');
    echo implode("\t", array_values($row)) . "\r\n";
}

function cleanData(&$str) {
        $str = preg_replace("/\t/", "\\t", $str);
        $str = preg_replace("/\r?\n/", "\\n", $str);
        if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
    }

你需要告訴 SQL 你想要從哪個表中獲取數據:

$sql_query = "SELECT t1.id, t1.first_name, t1.last_name, t1.email, t2.department_name 
FROM contacts t1
INNER JOIN departments t2 ON t12.department_id=t1.id 
ORDER BY t1.id";

當您在兩個表中都有相同的字段(例如您的情況中的 ID)時,SQL 會混淆選擇哪一個。

使用 * 不是一個好習慣,因為一旦您的表結構發生變化,它可能會破壞您的應用程序,但是,如果您必須使用它,以下將起作用:

$sql_query = "SELECT t1.*, t2.department_name 
FROM contacts t1
INNER JOIN departments t2 ON t2.department_id=t1.id 
ORDER BY t1.id";

這是帶有“動態”表的示例

$sql_query = "SELECT t1.*, t2.department_name 
FROM $table_name t1
INNER JOIN departments t2 ON t2.department_id=t1.id 
ORDER BY t1.id";

為了使這完全動態,您可以執行以下操作。

我將使用您的兩個表作為示例(未經測試,但它應該讓您走上正軌):

$table1_name = "contacts;
$table1_key = "id";
$table1_fields = "*";

$table2_name = "departments";
$table2_key = "id";
$table2_fields ="department_name";


$sql_query = "SELECT t1.$table1_fields, t2.$table2_fields
  FROM $table1_name t1
  INNER JOIN $table2_name t2 
    ON t2.$table2_key = t1.$table1_key
  ORDER BY t1.$table1_key";

請試試這個查詢

$sql_query = "SELECT *, contacts.id as id FROM contacts INNER JOIN departments 
ON contacts.department_id=departments.department_id ORDER BY contacts.id";

對此有兩種解決方案和第三種可能的解決方案。 1)

SELECT *, `department`.`id` as `depid`, `contacts`.`id` as `contactid`

然后,在您的代碼中,只需忽略虛假的“id”列並引用您想要的任何特定列

2)如果您使用的是PHP(看起來像)並使用PDO訪問數據,請使用

$stmt->fetchall(PDO::FETCH_NAMED)

並且您將在一個數組中獲得兩個 id,而不是一個覆蓋另一個。

你可能會通過翻轉表引用來獲得你想要的結果,而不是

SELECT * FROM Contacts INNER JOIN Departments

SELECT * FROM Departments INNER JOIN Contacts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM