Php 在MySQLi中使用5内部连接可以吗?

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.

我有6张桌子:

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,查看是否存在符合条件的记录。如果有任何问题,请通知我。