[英]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在這里將emp
和id
視為標識符:
ON educ.employee_id = emp.id
^^^ ^^
如果需要在MySQL中“轉義”標識符,請使用反引號字符,而不要使用單引號。 並分別封裝每個標識符,例如:
ON `educ`.`employee_id` = `emp`.`id`
^ ^ ^ ^ ^ ^ ^ ^
我也有另一個建議。 我建議您考慮使用mysqli或PDO接口而不是已棄用的mysql接口。
我還建議您考慮可能的SQL注入漏洞,包括“不安全”值作為SQL文本的一部分。 例如,考慮以下字符串的計算結果:
"... emp.id='$id'";
當$id
變量包含諸如1' OR '1'='1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.