2011-08-25 93 views
0

我有一點SQL,但我找不到方法來取回文本只是數字。 - 修改!複雜的SQL查詢問題

SELECT if(`linktype` = "group", 

(SELECT contactgroups.grname 
FROM contactgroups, groupmembers 
WHERE contactgroups.id = groupmembers.id ??? 
AND contactgroups.id = groupmembers.link_id), 

(SELECT contactmain.contact_sur 
FROM contactmain, groupmembers 
WHERE contactmain.id = groupmembers.id ??? 
AND contactmain.id = groupmembers.link_id)) AS adat 

FROM groupmembers; 

正如我現在已經改進了一下還給一些信息,但??? (感謝minitech)表明我的問題。我看不到我該如何修復...歡迎任何建議! Thansk

Contactmain (id, contact_sur, email2) 

data: 
1 | Peter | [email protected] 
2 | Andrew| [email protected] 

Contactgroups (id, grname) 

data: 
1 | All 
2 | Trustee 
3 | Comitee 

Groupmembers (id, group_id, linktype, link_id) 

data: 
1 | 1 | contact | 1 
2 | 1 | contact | 2 
3 | 2 | contact | 1 
4 | 3 | group | 2 

而且我想列出了誰是「Comitee」的結果應該是安德魯和受託人如果我是正確的:)

+0

如果'contactgroups.id'必須等於'groupmembers.id'但必須也等於'2',這是多餘的,我想這是你的問題可能是,太。 – Ryan

+0

如果第二個給你正確的答案,爲什麼你不能使用那個?另外,什麼是第一個查詢給你的錯誤,你實際期望的結果是什麼?注意:我們大多數人都皺着眉頭用逗號分隔的'FROM'子句,因爲它可以確定'JOIN'條件困難 - 請使用eplicit-join語法。 –

+0

請提供表格模式和示例數據。如果沒有表格模式,很難說清楚爲什麼你會得到文字而不是數字 –

回答

1

它在連接上看起來有點多餘,因爲暗示ID和Link_ID列都是相同的值。由於BOTH選擇值是從組成員表的資格派生而來的,因此我重新構造了查詢以使用THAT作爲主表,並對其他每個表執行LEFT JOIN,從您的查詢中預測應該從一個或其他表格。因此,對於每個相應的LEFT JOIN,您只會經過GroupMembers表一次。現在,你的IF()。既然小組成員是基礎,並且我們有兩個可用的表格和鏈接,我們只需從一個表中獲取相應的列。我已經包含了「鏈接類型」,僅供參考。通過使用STRAIGHT_JOIN將幫助引擎嘗試改變對如何加入表的解釋。

SELECT STRAIGHT_JOIN 
     gm.linktype, 
     if(gm.linktype = "group", cg.grname, cm.contact_sur) ADat 
    from 
     groupmembers gm 
     left join contactgroups cg 
      ON gm.link_id = cg.id 
     left join contactmain cm 
      ON gm.link_id = cm.id 
+0

再次感謝DRapp,總有希望:),也是社區的明智成員: )(抱歉我的英文) –

1

如果contactgroups.id必須等於groupmembers.id也必須等於2,這是多餘的,也可能是您的問題所在。它工作正常,因爲你已經寫了它:http://ideone.com/7EGLZ所以不知道它是什麼實際上應該做的我忍不住更多。

編輯:我不熟悉的逗號分隔FROM,但它提供了相同的結果,因爲你不選擇其他表的任何所以它其實並不重要。