0

使用这些表:

Table name:      Fields:
Users            userID
F                fID,userID
B                total,userID,bID
L                lID,bID

Users.userID 是“键”,它与其他表的关系是:

F.userID 与 Users.userID 相同 B.userID 与
Users.userID 相同 L.bID 与 B.bID
相同


对于每个 Users.userID,我需要显示:

F 中该用户 ID 的 fID 计数,B 中该用户 ID
的所有“总数”的总和,
以及来自 L 中的 B 的所有 lID 的计数。

(看下面的查询后会更清楚:)

我试过这个:

SELECT Users.userID, COUNT(F.fID) as 'fcount', SUM(B.total) as 'bcount', COUNT(L.lID) as 'lcount' 
FROM Users
    JOIN F ON F.userID=Users.userID
    JOIN B ON B.userID=Users.userID
    JOIN L ON L.bID=B.bID
GROUP BY Users.userID

现在,“计数”列显示的数字高得不合理,这并不能反映我希望得到的结果,而且我不知道它们来自哪里(也不需要,只需要知道如何得到正确的计数:))。

谢谢你。

4

1 回答 1

1

连接为左侧的每一行重复右侧的每个匹配行。如果您连接多个表,则行会重复更多。

例如,假设客户有五个订单和两个地址。然后以下查询将返回 1 x 5 x 2 = 10 行:

select  *
from    Customer c
join    [Order] o
on      o.CustomerID = c.ID
join    Address a
on      a.CustomerID = c.ID
where   c.ID = 42

如果您计算此行集的订单总数,您将得到两倍的金额,因为每个订单都针对每个地址重复。

这通常通过保证每组只返回一行的子查询来解决:

select  u.userID
,       fcount
,       bcount
,       lcount
from    Users u
join    (
        select  UserID
        ,       count(*) as fcount
        from    F
        group by
                UserID
        ) F
on      F.UserID = u.UserID
join    (
        select  UserID
        ,       sum(*) bcount
        from    B
        group by
                UserID
        ) B
on      B.UserID = u.UserID
join    (
        select  B.UserID
        ,       count(*) lcount
        from    B
        join    L
        on      L.bID = B.bID
        group by
                B.UserID
        ) L
on      L.UserID = u.UserID
于 2013-04-03T18:09:36.793 回答