0

好吧,我猜我需要一个子查询来解决这个问题,我对这些有点生疏。所以我有3张桌子:

tblAccount
tblItem
tblAccountItem

tblAccount - 有用户信息和 AccountID
tblItem - 有项目信息和 ItemID
AccountID - 有 3 个字段 - AccountItemID / AccountID / ItemID

一个账户可以有很多项目,一个项目可以有很多账户。示例数据:

tbl 帐户

AccountID    AccountName     AccountEmail
1            John Smith      john@smith.com
2            Fred John       fred@john.com
3            George Mike     george@mike.com

表项

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

所以我想展示 John 拥有哪些物品,并展示还有谁拥有该物品。我要显示的输出是:

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

任何帮助将不胜感激!

ctrahey 的答案是完美的,但我有一点要补充的条件。tblAccount 中有 2 种类型的帐户,由一个字段表示。

tbl 帐户

AccountID    AccountName     AccountEmail       AccountDescription    AccountTypeID
1            John Smith      john@smith.com     NULL                  1
2            Fred John       fred@john.com      NULL                  1
3            George Mike     george@mike.com    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 我猜需要创建 ALIAS 字段的查询。就像是:

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

我希望这是有道理的,感谢到目前为止的所有帮助!

4

3 回答 3

0

你最好使用编码来解决这个问题,这里粗略的查询可能会帮助你了解:

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

希望这可以帮助

于 2012-08-26T00:53:00.763 回答
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
于 2012-08-26T00:59:36.703 回答
0

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

我希望这有助于你的答案。我还在研究这个

于 2012-08-26T01:19:45.980 回答