2016-04-06 40 views
1

加入到相同的父表我有一個包含用戶信息和映射到用戶表與用戶ID的簽名表中的用戶表,如下面減小值的在MySQL

 
    users 
     userid | firstname | lastname 
     1 | John  | P 
     2 | Pete  | C 
     3 | Tim  | D 
 
    signs 
    doneBy | CheckedBy | VerifiedBy 
     1 | 2  | 3 

是否有一個更好的方式來做到這一點,而不是多個如下連接, 考慮到我會有6個這樣的連接

 
    select 
     concat(usr1.firstname, ' ', usr1.lastname) as doneby, 
     concat(usr2.firstname, ' ', usr2.lastname) as checkedby, 
     concat(usr3.firstname, ' ', usr3.lastname) as verifiedby 
    from signs sgn 
     join users usr1 on (usr1.userid = sgn.doneBy) 
     join users usr2 on (usr2.userid = sgn.checkedBy) 
     join users usr3 on (usr3.userid = sgn.verifiedBy) 
+0

你爲什麼在意?你的桌子上有幾百萬行嗎? –

+0

你是什麼意思,你在乎什麼? A)學習和B)總是更好地使用盡可能少的資源! @DirkHorsten – sagi

+0

你的時間來編程也是一種資源,更重要的是你的後繼者有時間瞭解它是一種資源。 Sagi的回答得到了我的讚賞,但是如果所有表格的行數少於一百,那麼寫入它的成本就超過了執行你的行爲的成本。然後我建議不要使用它。 –

回答

2

您可以使用CASE EXPRESSION如T有條件聚集做到這一點他:

SELECT MAX(CASE WHEN t.doneBy = t.userId THEN t.full_name END) AS doneBy, 
     MAX(CASE WHEN t.CheckedBy = t.userId THEN t.full_name END) AS doneBy, 
     MAX(CASE WHEN t.VerifiedBy = t.userId THEN t.full_name END) AS doneBy 
FROM (
    SELECT u.userid,concat(u.firstname, ' ', u.lastname) as full_name,u.* 
    FROM signs s 
    INNER JOIN users u 
     ON(s.userid IN(s.doneBy,s.CheckedBy,s.VerifiedBy))) t 
GROUP BY t.doneBy,t.checkBy,t.VerifiedBy 
+0

謝謝,@Sagi讓我檢查一下。 –

+0

沒問題的朋友,讓我知道它是否工作。 @KP。 – sagi

+0

查詢工作的人,我已經更新了您的答案,以運行查詢,感謝您的幫助 –