美好的一天,
我的数据库上有 4 个表(不是实际名称,但几乎相似),它们是 ff: employee,education,employment_history,reference
employee_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 将 emp
和 id
视为标识符:
ON educ.employee_id = emp.id
^^^ ^^
如果需要在 MySQL 中“转义”标识符,请使用反引号字符,而不是单引号。并将每个标识符单独括起来,例如:
ON `educ`.`employee_id` = `emp`.`id`
^ ^ ^ ^ ^ ^ ^ ^
<小时/>
我还有另一个建议。我建议您考虑使用 mysqli 或 PDO 接口(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/