如何用PHP将多个带外键的MYSQL表实现成HTML表?
我是新的SQL和PHP,我正在尝试实现一个表,其中显示3个表的内容(所有表都与另一个包含外键的表链接) 我的主表由如何用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', '
作业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);