2012-08-26 57 views
0

好吧我在猜測我需要一個子查詢來解決這個問題,而且我對這些很少生疏。所以,我有3個表:MySQL子查詢概述

tblAccount
tblItem
tblAccountItem

tblAccount - 擁有用戶信息和帳戶ID
tblItem - 有項目信息和項目ID
的AccountID - 有3個領域 - AccountItemID /帳戶ID /商品ID

一個賬戶可以有很多項目,一個項目可以有很多賬戶。示例數據:

tblAccount

AccountID AccountName  AccountEmail 
1   John Smith  [email protected] 
2   Fred John  [email protected] 
3   George Mike  [email protected] 

tblItem

ItemID  ItemName  ItemDescription 
1   Hammer   Smashes things 
2   Axe    Breaks things 

好了,所以可以說錘是屬於約翰,弗雷德和喬治。斧只屬於約翰和弗雷德。

tblAccountItem

AccountItemID  AccountID  ItemID 
1     1    1 
2     2    1 
3     3    1 
4     1    2 
5     2    2 

所以我想表明哪些項目約翰,也表明還有誰擁有該項目。我想顯示的輸出是:

ItemName   ItemDescription OtherOwners 
Hammer    Smashes things  Fred, George 
Axe     Breaks things  Fred 

任何幫助將不勝感激!

ctrahey的答案是完美的,但我有一個輕微的條件添加。 tblAccount中有兩種類型的帳戶由字段表示。

tblAccount

AccountID AccountName  AccountEmail  AccountDescription AccountTypeID 
1   John Smith  [email protected]  NULL     1 
2   Fred John  [email protected]  NULL     1 
3   George Mike  [email protected] Runner    2 

tblAccountTypeID

AccountTypeID AccountType  
1    User  
2    Admin  

如果AccountTypeID是1,那麼我需要輸出AccountEmail。如果AccountTypeID是2,我需要輸出AccountDescription。例如,輸出(同樣的故事如上):

ItemName   ItemDescription OtherOwners 
Hammer    Smashes things  Fred, Runner 
Axe     Breaks things  Fred 

去關閉該ctrahey我猜有需要創建一個別名字段中的查詢。就像:

WHERE AccountTypeID = 1 (SELECT AccountName) 
WHERE AccountTypeID = 2 (SELECT AccountDescription) 

我希望這是有道理的,感謝所有幫助到目前爲止!

回答

0

子查詢很少實際需要,並經常更換(通過改進的性能)通過精心設計的JOIN。這裏,我們從AccountItem表開始(WHERE子句立即將查詢限制爲只有我們感興趣的賬戶擁有的項目);那麼我們加入同一個表(將其別名爲'others_items_join'),告訴它加入相同的itemID,但如果感興趣,則不屬於我們的帳戶。這是整個查詢的本質,接下來的兩個連接只是將我們想要在我們的輸出中輸入的實際字符串(其他人的名稱和項目名稱/描述)引入。 GROUP BY用於爲每個項目提供我們感興趣的帳戶的一行。

SELECT 
    ItemName, 
    ItemDescription, 
    GROUP_CONCAT(others.AccountName) as OtherOwners 
FROM 
    tblAccountItem as my_items 
    LEFT JOIN tblAccountItem as others_items_join 
    ON others_items_join.ItemID = my_items.ItemID AND others_items_join.AccountID != ? 
    LEFT JOIN tblAccount as others 
    ON others_items_join.AccountID = others.AccountID 
    JOIN tblItems ON my_items.ItemID = tblItems.ItemID 
WHERE my_items.AccountID = ? 
GROUP BY ItemName 
+0

這看起來可能就是這樣!現在只是測試它,但迄今爲止似乎是完美的。感謝你的回答。 – user1625233

+0

在測試中,它的工作非常完美。由於上述示例已從我的項目中簡化,所以我添加了一個小問題。 – user1625233

0

你最好使用一個編碼,以甲階酚醛樹脂這一點,在這裏粗略查詢5月可以幫助你得到一個想法:

SELECT AccountName 
FROM tblAccount 
WHERE AccountID = (SELECT AccoundID 
        FROM tblAccountItem 
        WHERE itemID = (SELECT itemID 
            FROM tblAccountItem 
            WHERE AccountID = 1 (john Id as example))); 

希望這有助於

+0

我跑了這一點,並得到了一個錯誤: 錯誤代碼:1242子查詢返回多個1個 感謝您的快速答覆! – user1625233

0

SELECT ItemName, ItemDescription, AccountItemID FROM tblitem RIGHT JOIN tblaccountitem ON tblitem.ItemID=tblaccountitem.ItemID

我希望這有助於導致你的答案。我仍然在尋找這個