簡體   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