可以在MySQLi中使用5 INNER JOIN吗?

时间:2014-09-09 03:40:37

标签: php mysql mysqli

我有6张桌子:

employee, contact, educ, employment, work, familybg eid是从foreign key表中获取的employee。现在我在我的一个网页file.php上显示结果时遇到了麻烦。我要做的是显示从6个表中的每个表中获取的所有值,并将它们组合在一起,并使用INNER JOIN作为employee_id的关系,employee_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_fetch_assoc($sql))下,并将每列分配给我给定的变量名称。 I.G $name =$row['name'];...etc...etc让我可以轻松地将结果放在桌子上。像这样:

<table><tr><td><td><?php echo $name; ?></td></td><tr></table>这就是我对其他剩余列所做的操作,将它们放在<table>标记上。

由于我有6个表,因此我创建了6个相应的<table>,其中包含每个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>

但每次运行此代码时,都无法显示任何结果。好像我只用空行做了一个。现在我想知道,这是我使用INNER JOIN使这次尝试失败的方式,还是因为我过度使用影响整个查询的<table>标签?另外,我怀疑mysqli_fetch_assoc()在我的情况下,我真的需要能够显示行吗?或者可能还有mysqli的另一个查询函数从database中检索除此之外的行?哦,顺便说一句,我已经尝试过mysqli_fetch_array(),但即便看起来也不行。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您注意到每个INNER JOIN一次处理一个并且处于一致的&#34; JOIN Link&#34;每一次。当第一个INNER JOIN完成时,即ccon.eid=cemp.eid - 然后它继续移动到下一个ceduc.eid=cemp.eid,但确保其中一个表与最后一个连接相同(有点像跟随从另一个加入。)你可以看到,因为表格的数量会增加所需表格的构建时间也会增加。

注意 :1)在你的sql for inner join中不要使用ccon.eid='cemp.eid'。使用ccon.eid=cemp.eid。这就是你没有得到任何行的原因。对于每个内连接都跟着相同。

2)更安全的一面使用左连接或右连接。因为在内连接中,如果任何记录不匹配,你将得不到输出。

答案 1 :(得分:0)

虽然使用内连接所有maping应该有值,但它不会给出输出。

尝试将所有inner join更改为left join,如果它设置了行集,则只有互斥映射可用。

所以你的查询将如下所示。

$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'");