繁体   English   中英

过多使用3个以上表的内部联接

[英]Excessive use of Inner Join for more than 3 tables

美好的一天,

我的数据库上有4个表(不是实际名称,但几乎相似),它们是ff: employee,education,employment_history,referrence employee_id是employee表中外键的名称。

这是示例(非实际)数据:

**Employee**
ID       Name      Birthday     Gender           Email
1     John Smith  08-15-2014     Male     johnsmith@extension.com
2     Jane Doe    00-00-0000    Female    janedoe@extension.com
3     John Doe    00-00-0000     Male     johndoe@extension.com

**Education**
Employee_ID     Primary            Secondary             Vocation
1              Westside School    Westshore H.S       SouthernBay College
2              Eastside School    Eastshore H.S       NorthernBay College
3              Northern School    SouthernShore H.S   WesternBay College

**Employment_History**
Employee_ID      WorkOne         StartDate     Enddate
1              StarBean Cafe    12-31-2012    01-01-2013
2              Coffebucks Cafe  11-01-2012    11-02-2012
3              Latte Cafe       01-02-2013    04-05-2013

Referrence
Employee_ID     ReferrenceOne         Address        Contact
1               Abraham Lincoln   Lincoln Memorial  0000000000
2               Frankie N. Stein   Thunder St.       0000000000
3               Peter D. Pan      Neverland Ave.    0000000000

注意:尽管其余部分是查询的一部分,但我只包括了几列。

以下是我连续3天从事的代码:

$sql=mysql_query("SELECT emp.id,emp.name,emp.birthday,emp.pob,emp.gender,emp.civil,emp.email,emp.contact,emp.address,emp.paddress,emp.citizenship,educ.employee_id,educ.elementary,educ.egrad,educ.highschool,educ.hgrad,educ.vocational,educ.vgrad,ems.employee_id,ems.workOne,ems.estartDate,ems.eendDate,ems.workTwo,ems.wstartDate,ems.wendDate,ems.workThree,ems.hstartDate,ems.hendDate 

FROM employee AS emp INNER JOIN education AS educ ON educ.employee_id='emp.id' INNER JOIN employment_history AS  ems ON ems.employee_id='emp.id' INNER JOIN referrence AS  ref ON ref.employee_id='emp.id' 

WHERE emp.id='$id'");

这样使用INNER JOIN可以吗? 还是应该修改查询以获取所需的结果? 我也尝试过使用LEFT JOIN但它仍然不返回任何内容。我不知道我在哪里出错。 正如我所想,您看到的是,我一直在以正确的方式使用INNER JOIN (因为它已放置在WHILE CLAUSE之前)。 因此,我无法想到可能发生了什么错误。

你们有建议吗? 提前致谢。

我建议您检查一下字符串常量的使用,例如连接谓词中的'emp.id'

我怀疑您不是要与字符串文字进行比较,而是要与引用另一个表中的列的表达式进行比较。

查询中的谓词将employee_id列与字符串文字(包含六个字符的常量)进行比较。 这是用emp.id括起来的单引号,使MySQL在这里将其视为原义:

    ON educ.employee_id = 'emp.id'
                          ^      ^

我怀疑您想将employee_id列与employees表中的id列进行比较。 缺少单引号使MySQL在这里将empid视为标识符:

    ON educ.employee_id = emp.id
                          ^^^ ^^

如果需要在MySQL中“转义”标识符,请使用反引号字符,而不要使用单引号。 并分别封装每个标识符,例如:

    ON `educ`.`employee_id` = `emp`.`id`
       ^    ^ ^           ^   ^   ^ ^  ^

我也有另一个建议。 我建议您考虑使用mysqliPDO接口而不是已弃用的mysql接口。

我还建议您考虑可能的SQL注入漏洞,包括“不安全”值作为SQL文本的一部分。 例如,考虑以下字符串的计算结果:

   "... emp.id='$id'";

$id变量包含诸如1' OR '1'='1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM