Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用PHP将多个带外键的MYSQL表实现成HTML表?_Php_Html_Mysql_Foreign Keys - Fatal编程技术网

如何用PHP将多个带外键的MYSQL表实现成HTML表?

如何用PHP将多个带外键的MYSQL表实现成HTML表?,php,html,mysql,foreign-keys,Php,Html,Mysql,Foreign Keys,我是新的SQL和PHP,我正在尝试实现一个表,其中显示3个表的内容(所有表都与另一个包含外键的表链接) 我的主表由作业id、员工id*、系列id*和频道id*组成。所有带有*链接到另一个表,它们是主键。我想使用PHP在一个大表中显示所有其他表的信息 到目前为止,我能够显示我的主表,而不需要任何其他表的信息。下面是我的信息,我一直在想从这里可以走到哪里,因为这对我来说是全新的 <?php $dbconnect=mysqli_connect('localhost', 'user', '

我是新的SQL和PHP,我正在尝试实现一个表,其中显示3个表的内容(所有表都与另一个包含外键的表链接)

我的主表由
作业id
员工id*
系列id*
频道id*
组成。所有带有
*
链接到另一个表,它们是主键。我想使用PHP在一个大表中显示所有其他表的信息

到目前为止,我能够显示我的主表,而不需要任何其他表的信息。下面是我的信息,我一直在想从这里可以走到哪里,因为这对我来说是全新的

    <?php
$dbconnect=mysqli_connect('localhost', 'user', 'pass', 'database');
 // Check connection
 if (mysqli_connect_errno())
   {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }

 $result = mysqli_query($dbconnect,"SELECT * FROM JOB_LIST");
 echo "<table border='1'>
 <tr>
 <th>Job ID</th>
 <th>Staff ID</th>
 <th>Channel ID</th>
 <th>Series ID</th>
 </tr>";
 while($row = mysqli_fetch_array($result))
   {
   echo "<tr>";
   echo "<td>" . $row['JOB_STAFF'] . "</td>";
   echo "<td>" . $row['JOB_CHANNEL'] . "</td>";
   echo "<td>" . $row['JOB_SERIES'] . "</td>";
   echo "</tr>";
   }
 echo "</table>";
 mysqli_close($dbconnect);
 ?> 
但我不知道需要改变什么来实现它。如果我没有解释什么,我道歉会试图解释得更好。

正如前面所说的,这是你需要的

关于连接的几句话

两个表之间没有任何条件的简单交叉连接就是一个叉积。列将相加,行将相乘。因此,如果一个表有3列20行,另一个表有5列1000行,那么连接的表将有3+5=8列和20*1000=20000行

通常你不需要整个叉积。这就是为什么你可以利用条件。内部联接类似于交叉联接,但有一个附加的ON关键字定义联接条件,以根据需要减少生成的行数。这意味着不符合条件的每一行都将被排序。从技术上讲,它与WHERE子句相同,但不应混淆,因为从语义上讲,它是一个非常不同的野兽。通常,联接条件与主键匹配

可以执行多个联接,其中第一个表与第二个表联接的结果将与第三个表联接,以此类推

SELECT * FROM table_1 AS t1
    INNER JOIN table_2 AS t2
    ON t1.foreign_key_1 = t2.primary_key
    INNER JOIN table_3 AS t3
    ON t1.foreign_key_2 = t3.primary_key;
如您所见,我还使用As关键字为表指定别名。这很重要,因为不同的表可能具有相同的字段名。这些所谓的限定名称避免了任何可能的名称冲突

但是内部连接仍然不是您要寻找的。您有以下情况:

对于每个不同的作业ID,您希望在输出表中有一行。无论它引用的是整个外键集(staff_ID、channel_ID、series_ID),还是只有少数外键,例如staff_ID和channel_ID,或者根本没有条目,都应该始终存在

内部联接将拒绝所有这些部分行,因为联接的两侧(表)的ON条件必须为true。幸运的是,左外部联接确保左侧的表将保留其所有行,并在右侧的表中查找与ON条件匹配的行。无法匹配的行中的列将用空值填充。正如您可能已经猜到的那样,右外部联接正好相反

这就是您需要的查询。

SELECT li.id AS job_id, st.id AS staff_id, st.firstname AS staff_firstname, st.surname AS staff_surname,
    st.email AS staff_email, ch.id AS channel_id, ch.name AS channel_name,
    ch.network AS channel_network, se.id AS series_id, se.name AS series_name,
    se.count AS series_count
    FROM job_list AS li
    LEFT OUTER JOIN job_staff AS st
    ON li.staff_id = st.id
    LEFT OUTER JOIN job_channel AS ch
    ON li.channel_id = ch.id
    LEFT OUTER JOIN job_series AS se
    ON li.series_id = se.id;
下面是更新的PHP部分。您可能需要根据需要调整一些列和表名称,因为我无法预测数据库名称和表模式。但是基于我做的这个,它应该完全按照你想要的方式工作。滚动到底部,您将看到查询产生的表格

$dbconnect=mysqli_connect('localhost', 'user', 'pass', 'test');

// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$query = "SELECT li.id AS job_id, st.id AS staff_id, st.firstname AS staff_firstname, st.surname AS staff_surname,
            st.email AS staff_email, ch.id AS channel_id, ch.name AS channel_name,
            ch.network AS channel_network, se.id AS series_id, se.name AS series_name,
            se.count AS series_count
            FROM job_list AS li
            LEFT OUTER JOIN job_staff AS st
            ON li.staff_id = st.id
            LEFT OUTER JOIN job_channel AS ch
            ON li.channel_id = ch.id
            LEFT OUTER JOIN job_series AS se
            ON li.series_id = se.id;";

$result = mysqli_query($dbconnect, $query);

echo "<table border='1'>
<tr>
    <th>Job ID</th>
    <th>Staff ID</th>
    <th>Staff Firstname</th>
    <th>Staff Surname</th>
    <th>Staff E-mail</th>
    <th>Channel ID</th>
    <th>Channel Name</th>
    <th>Channel Network</th>
    <th>Series ID</th>
    <th>Series Name</th>
    <th>Series Count</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
    echo "<tr>";
    echo "<td>" . $row['job_id'] . "</td>";
    echo "<td>" . $row['staff_id'] . "</td>";
    echo "<td>" . $row['staff_firstname'] . "</td>";
    echo "<td>" . $row['staff_surname'] . "</td>";
    echo "<td>" . $row['staff_email'] . "</td>";
    echo "<td>" . $row['channel_id'] . "</td>";
    echo "<td>" . $row['channel_name'] . "</td>";
    echo "<td>" . $row['channel_network'] . "</td>";
    echo "<td>" . $row['series_id'] . "</td>";
    echo "<td>" . $row['series_name'] . "</td>";
    echo "<td>" . $row['series_count'] . "</td>";
    echo "</tr>";
}
echo "</table>";

mysqli_close($dbconnect);
$dbconnect=mysqli_connect('localhost','user','pass','test');
//检查连接
if(mysqli\u connect\u errno())
{
echo“未能连接到MySQL:”.mysqli_connect_error();
}
$query=“选择li.id作为职务id,st.id作为职员id,st.firstname作为职员名,st.LANSAME作为职员名,
st.email作为员工电子邮件,ch.id作为频道id,ch.name作为频道名称,
ch.network作为通道网络,se.id作为系列id,se.name作为系列名称,
se.计数为系列\ U计数
从工作列表中选择li
左外接工作人员作为st
在li.staff_id=st.id上
左侧外部联接作业\u通道作为通道
在li.channel_id=ch.id上
左外联接job_系列作为se
关于li.series_id=se.id;“;
$result=mysqli\u查询($dbconnect,$query);
回声“
工作ID
员工身份证
职员姓名
职员姓氏
员工电子邮件
通道ID
频道名称
渠道网络
序列号
系列名称
系列计数
";
while($row=mysqli\u fetch\u数组($result))
{
回声“;
回显“$row['job_id']”;
echo“$row['staff_id'”;
echo“$row['staff_firstname'”;
回音“$row['staff_姓氏]”;
回显“$row['staff_email']”;
回显“$row['channel_id']”;
回显“$row['channel_name']”;
echo“$row['channel_network']”;
回显“$row['series_id']”;
回显“$row['series_name']”;
回显“$row['series_count']”;
回声“;
}
回声“;
mysqli_close($dbconnect);

我希望我能解释一下。如果有什么不清楚的地方,请随时询问。

左键连接是您的解决方案,您尝试过吗?@skywalker我将如何实现它?我完全不懂。我不想粗鲁什么的,但你试过谷歌我写的东西吗?与其给你完整的解决方案,不如教你如何搜索,但有人已经回答了,这样你就不必麻烦了。
$dbconnect=mysqli_connect('localhost', 'user', 'pass', 'test');

// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$query = "SELECT li.id AS job_id, st.id AS staff_id, st.firstname AS staff_firstname, st.surname AS staff_surname,
            st.email AS staff_email, ch.id AS channel_id, ch.name AS channel_name,
            ch.network AS channel_network, se.id AS series_id, se.name AS series_name,
            se.count AS series_count
            FROM job_list AS li
            LEFT OUTER JOIN job_staff AS st
            ON li.staff_id = st.id
            LEFT OUTER JOIN job_channel AS ch
            ON li.channel_id = ch.id
            LEFT OUTER JOIN job_series AS se
            ON li.series_id = se.id;";

$result = mysqli_query($dbconnect, $query);

echo "<table border='1'>
<tr>
    <th>Job ID</th>
    <th>Staff ID</th>
    <th>Staff Firstname</th>
    <th>Staff Surname</th>
    <th>Staff E-mail</th>
    <th>Channel ID</th>
    <th>Channel Name</th>
    <th>Channel Network</th>
    <th>Series ID</th>
    <th>Series Name</th>
    <th>Series Count</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
    echo "<tr>";
    echo "<td>" . $row['job_id'] . "</td>";
    echo "<td>" . $row['staff_id'] . "</td>";
    echo "<td>" . $row['staff_firstname'] . "</td>";
    echo "<td>" . $row['staff_surname'] . "</td>";
    echo "<td>" . $row['staff_email'] . "</td>";
    echo "<td>" . $row['channel_id'] . "</td>";
    echo "<td>" . $row['channel_name'] . "</td>";
    echo "<td>" . $row['channel_network'] . "</td>";
    echo "<td>" . $row['series_id'] . "</td>";
    echo "<td>" . $row['series_name'] . "</td>";
    echo "<td>" . $row['series_count'] . "</td>";
    echo "</tr>";
}
echo "</table>";

mysqli_close($dbconnect);