Php 在mysql中设置外键

Php 在mysql中设置外键,php,mysql,Php,Mysql,假设我有两个表联系人和部门 下表内容如下: 联系人: 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 | Finan

假设我有两个表
联系人
部门

下表内容如下:

联系人:

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
我正在尝试使用
internaljoin

我的问题是:

$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";
我已经提到了以下问题:

但我不想创建一个临时表

我在想也许有一种方法可以将id列从department表中调出

添加

我可以使用查询打印表中的元素:

$sql_query = "SELECT * FROM $table_name INNER JOIN departments ON $table_name.department_id=departments.department_id ORDER BY $table_name.id";
它工作得很好,但问题是当我试图在网页上打印详细信息时,
contacts
表中的
id
不知何故被
departments
表中的
id
覆盖了

我用来打印表格的代码是:

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
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 />    
请尝试此查询

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

您需要告诉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";
下面是“动态”表的示例

要使其完全动态化,可以执行以下操作

我将以您的两个表为例(未经测试,但它应该会让您走上正确的道路):


有两种解决方案,第三种可能的解决方案。 (一)

然后,在您的代码中,只需忽略虚假的“id”列,并引用您想要的特定列

2) 如果您正在使用PHP(看起来是这样)并使用PDO访问数据,请使用

$stmt->fetchall(PDO::FETCH_NAMED)
您将在一个数组中获得两个ID,而不是一个覆盖另一个

您可以通过翻转表引用来获得想要的结果 i、 e.代替

SELECT * FROM Contacts INNER JOIN Departments
使用


我不想给每一列命名—您并没有给它命名,您只是告诉SQL使用哪一列。使用*从来都不是一个好习惯,因为结构发生变化,你的应用程序可能会停止运行。我不想指定它!!我们有超过400 GB的数据库和超过2000个表,这并不重要,它仍然是最佳实践。你可以在这里读到更多关于它的信息:太好了。。。谢谢。。。。现在我有了一个使用动态表名的想法!!:):)
$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";
SELECT *, `department`.`id` as `depid`, `contacts`.`id` as `contactid`
$stmt->fetchall(PDO::FETCH_NAMED)
SELECT * FROM Contacts INNER JOIN Departments
SELECT * FROM Departments INNER JOIN Contacts