mysql - 超过 3 个表过度使用 Inner Join

标签 mysql sql join

美好的一天,

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

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

**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

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

下面是我连续三天编写的代码:

$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 接口(interface),而不是已弃用的 mysql 接口(interface)。

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

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

$id变量包含诸如1' OR '1'='1之类的值时

关于mysql - 超过 3 个表过度使用 Inner Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417944/

相关文章:

php - 使用 1 个查询从 mysql 表中选择一个值

php - Mysql - 如何在 1 条记录中加入自定义字段标题和数据的表

php - 哈希输出对 SQL 查询有危险吗?

sql - 子查询与连接

join - 是否有 clojure 函数来 "join"两个映射列表?

mysql - 如何在mysql连接中将字段转换为字符串

MySQL: "` myTbl` .`foo` = foo"evaluates to true. 我该如何防止呢?

php - 拉维尔 5 : differentiate if new row inserted in DB

mysql - 单个查询中的不同计数

mysql - 使用最小列值创建左连接?