2014-01-17 69 views
3

我試圖通過使用Join從表2中獲取技巧名稱skill1,skill2,& skill3MYSQL加入同一表中的多列

當我試圖單獨獲得skill1時它工作正常。但是,1066當我嘗試獲取下一列的詳細信息時,出現錯誤,並非唯一表格/別名


表1(用戶表)

====================================== 
ID Name  skill skill2 skill3 
====================================== 
1 Ed   1  4  3  
-------------------------------------- 

表2(技術細節)

========================= 
ID Skill Name 
========================= 
1 php 
2 html 
3 css 
4 mysql 
------------------------- 

這是我希望得到:

[name] => 'Ed' 
[skill1] => 'php' 
[skill2] => 'mysql' 
[skill3] => 'css' 

這裏是我的代碼,我使用laravel:

DB::table('table1') 
    ->join('table2', function($join) 
    { 
     $join->on('table1.skill1', '=', 'table2.id'); 
    }) 
    ->join('table2', function($join) 
    { 
     $join->on('table1.skill2', '=', 'table2.id'); 
    }) 
    ->join('table2', function($join) 
    { 
     $join->on('table1.skill3', '=', 'table2.id'); 
    }) 
    ->get(); 
+2

不是答案,但我會先重新組織我的表格,並介紹第三個將用戶ID鏈接到技能ID的方法。然後你不限於3(或你的用戶表中的技能字段數量)。 – jeroen

+0

@ jeroen多對多的關係並不適合心靈的暈眩 –

+0

想想你有3個連接,每個連接都可以通過skill.id將User.skil(n)加入到技能表中,提示:每個連接在user.skil (n)將有一個表別名。現在,您可以嘗試並顯示您所做的所有操作 –

回答

11

嘗試此查詢:

SELECT U.Name AS Name, S1.Skill Name AS Skill1, S2.Skill Name AS Skill2, S3.Skill Name AS Skill3 
    FROM table1 U 
    JOIN table2 S1 ON (S1.Id = U.skill1) 
    JOIN table2 S2 ON (S2.Id = U.skill2) 
    JOIN table2 S3 ON (S3.Id = U.skill3) 
+0

不錯......但是,當使用三個以上的連接時,性能非常糟糕。 – Pathros

2

相同的結果@erickmcarvalho查詢

SELECT Table1.usrname, 
(SELECT Table2.skillname FROM Table2 WHERE Table1.skill1 = Table2.Id) As skill1, 
(SELECT Table2.skillname FROM Table2 WHERE Table1.skill2 = Table2.Id) As skill2, 
(SELECT Table2.skillname FROM Table2 WHERE Table1.skill3 = Table2.Id) As skill3 
FROM Table1 

還是引起4個查詢,對於重構表格會更好

+0

謝謝。是的,你是對的,但JOIN稍快,但 –

+0

3子查詢沒有錯。我認爲重組一個表格與適當的子查詢索引是一個相當愚蠢的主張。只要確保所有的子查詢都在索引上運行,並且應該沒有問題。 – Bruce