Php 在MySQLi中使用5内部连接可以吗?
我有6张桌子:Php 在MySQLi中使用5内部连接可以吗?,php,mysql,mysqli,Php,Mysql,Mysqli,我有6张桌子: employee、contact、educ、employment、work、familybgeid是取自employee表的外键。现在我在我的一个网页file.php上显示结果时遇到了问题。我试图做的是显示从6个表中每个表中获取的所有值,并使用内部联接将它们组合在一起,作为与员工id的关系,该id包含员工的姓名和最低详细信息 请参见查询(但不是确切的列名): file.php $sql=mysqli_query($db," SELECT cemp.eid , cemp.
employee、contact、educ、employment、work、familybg
eid是取自employee
表的外键。现在我在我的一个网页file.php上显示结果时遇到了问题。我试图做的是显示从6个表中每个表中获取的所有值,并使用内部联接
将它们组合在一起,作为与员工id的关系,该id包含员工的姓名和最低详细信息
请参见查询(但不是确切的列名):
file.php
$sql=mysqli_query($db,"
SELECT cemp.eid
, cemp.fname
, cemp.mname
, cemp.lname
, cemp.age
, cemp.gender
, cemp.birthday
, cemp.birthplace
, cemp.citizenship
, cemp.status
, cemp.sss
, cemp.philhealth
, cemp.tin
, cemp.height
, cemp.weight
, con.address
, con.province
, con.postcode
, con.telno
, con.mobile
, ccon.email
, ccon.alternate
, ceduc.elem
, ceduc.egrad
, ceduc.high
, ceduc.hgrad
, ceduc.college
, ceduc.cgrad
, cems.position
, cems.hireDate
, cems.job_desc
, cems.basic
, cems.salary
, cw.company_name
, cw.position
, cw.desc
, cw.startDate
, cw.endDate
, cfam.fatherName
, cfam.motherName
, cfam.sibling
, cfam.spouse
, cfam.children
FROM ch_employee cemp
INNER
JOIN contact ccon
ON ccon.eid = 'cemp.eid'
INNER
JOIN educ ceduc
ON ceduc.eid = 'cemp.eid'
INNER
JOIN employment cems
ON cems.eid = 'cemp.eid'
INNER
JOIN work cw
ON cw.eid = 'cemp.eid'
INNER
JOIN family_bg cfam
ON cfam.eid = 'cemp.eid'
WHERE cemp.eid = '$id';
");
当然,结果被放置在while($row=mysqli\u fetch\u assoc($sql))
下,并将每一列分配给我给定的变量名。I.G$name=$row['name'];。。。etc…etc
让我更容易将结果放在表格上。像这样:
这就是我对其余列所做的操作,将它们放在
标记上
因为我有6个表,所以我分别创建了6个
,其中包含每个db表的所有列。我将向您展示一个示例:
<table>
<thead>
<tr>
<th><strong>Name:</strong></th>
<th><strong>Address:</strong></th>
<th><strong>Contact#:</strong></th>
<th><strong>Email:</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo $name; ?></td>
<td><?php echo $address; ?></td>
<td><?php echo $contact; ?></td>
<td><?php echo $email; ?></td>
</tr>
</tbody>
名称:
地址:
联系方式:
电子邮件:
但每次我运行这段代码时,都无法显示任何结果。好像我只对空的行做了一个标记。现在我想知道,是我使用内部连接的方式使这次尝试失败了,还是因为我过度使用
标记影响了整个查询?此外,我对mysqli_fetch_assoc()表示怀疑。在我的情况下,我真的需要它来显示行吗?或者,除了此之外,mysqli
还有另一个查询函数从数据库中检索行?哦,顺便说一句,我试过mysqli_fetch_array(),但即使这样似乎也不起作用
有什么想法吗?如果您注意到每个内部连接一次处理一个,并且每次都以一致的“连接链接”处理。当第一个内部联接完成时,即,ccon.eid=cemp.eid
,它接着移动到下一个ceduc.eid=cemp.eid
,但要确保被联接的表之一与最后一个联接相同(有点像是从一个接一个地进行联接)。因此,您可以看到,由于表格的数量会增加,因此所需表格的构建时间也会增加
注意
:1)在用于内部联接的sql中,不要使用ccon.eid='cemp.eid'
。请使用ccon.eid=cemp.eid
。这就是您没有获得任何行的原因。请对每个内部联接执行相同的操作
2) 为了安全起见,请使用左连接或右连接。因为在内部连接中,如果任何记录不匹配,您将不会得到任何输出。在使用内部连接时,所有映射都应该有值,否则不会给出输出
尝试将所有内部联接
更改为左联接
,如果它提供行集合,则只有互斥映射可用
因此,您的查询如下所示
$sql=mysqli_query($db,"SELECT cemp.eid,cemp.fname,cemp.mname,cemp.lname,cemp.age,cemp.gender,cemp.birthday,cemp.birthplace,
cemp.citizenship,cemp.status,cemp.sss,cemp.philhealth,cemp.tin,cemp.height,cemp.weight,con.address,con.province,
con.postcode,con.telno,con.mobile,ccon.email,ccon.alternate,ceduc.elem,ceduc.egrad,ceduc.high,ceduc.hgrad,ceduc.college,ceduc.cgrad,
cems.position,cems.hireDate,cems.job_desc,cems.basic,cems.salary,cw.company_name,cw.position,cw.desc,cw.startDate,cw.endDate,
cfam.fatherName,cfam.motherName,cfam.sibling,cfam.spouse,cfam.children FROM ch_employee AS cemp
LEFT JOIN contact AS ccon ON ccon.eid='cemp.eid'
LEFT JOIN educ AS ceduc ON ceduc.eid='cemp.eid'
LEFT JOIN employment AS cems ON cems.eid='cemp.eid'
LEFT JOIN work AS cw ON cw.eid='cemp.eid'
LEFT JOIN family_bg AS cfam ON cfam.eid='cemp.eid' WHERE cemp.eid='$id'");
使用这么多内部连接语句没有什么错。您需要对SQL查询启用错误报告,以找出它不喜欢的内容。此外,将该查询打印到页面,然后在phpmyadmin/mysql控制台中运行它,它在那里工作吗?这没有错,但是随着表的增加,它会花费很多时间,与成比例:M*N*O*P*Q
假设它们是行数。我认为更好的问题是:一次查询所有这些字段真的有意义吗?从技术上讲,您可以连接许多表。。但“过度”规范化表会带来成本效益。。。有时不需要将数据存储在全部链接的5个表中,但有时需要,这取决于系统和连接的内容。使用内部连接时,所有映射都应该有值,否则不会给出输出。尝试将所有内部连接
更改为左连接
如果它提供行集,则只有互斥映射可用。我已放置或die(mysqli_error($db))代码>在我的查询之后,它以某种方式显示了一些命名错误的列,但是在修复它并执行您的建议之后[w/c从内部联接的其余部分删除单引号]实际输出仅显示带有CSS样式的
,但未显示任何值/行。请在phpmyadmin中运行sql,查看是否存在符合条件的记录。如果有任何问题,请通知我。