MySQL - 仅选择每个外键的最后一条记录

时间:2016-03-23 19:02:39

标签: mysql sql

我有3个像这样的表(剥离版本):

Create table A (
    AID Int NOT NULL,
    PRIMARY KEY (AID)
)

Create table B (
    BID Int NOT NULL,
    AID Int NOT NULL,
    PRIMARY KEY (BID),
    FOREIGN KEY (AID) REFERENCES A(AID)
)

Create table C (
    CID Int NOT NULL,
    BID Int NOT NULL,
    Price Decimal(12,4) NOT NULL,
    PRIMARY KEY (CID),
    FOREIGN KEY (BID) REFERENCES B(BID)
)

A中的每个记录在B中只能有一个最新记录(最后一个ID被认为是最新的),例如:我们在A中有一条记录,其中B中有3个相关记录,但只有最后一条记录是被认为是最新的,只应使用那个。

每次更新B中的记录(在这种情况下插入)时,C中的所有记录都会重复并指向B中新创建的记录。

如何获得所有A记录的C.Price的总和。

到目前为止,我得到了:(但不同似乎没有用)

SELECT SUM(Price)
FROM C
INNER JOIN (
    SELECT DISTINCT t2.AID, t2.BID
    FROM (
        SELECT BID, AID
        FROM B
        INNER JOIN (
            SELECT AID
            FROM A
            -- some other statements go here
        ) t1
        ON t1.AID = AID
        ORDER BY BID DESC
    ) t2
) t3
ON t3.BID = C.BID

我希望我解释得很好。 :/

2 个答案:

答案 0 :(得分:2)

  

每次更新B中的记录(在这种情况下插入),全部   C中的记录是重复的,并指向新创建的记录   乙

这意味着只有C中的记录具有最新的CONSOLE值。这意味着,您不需要BID它们,您只需要获取最新记录。

只是用样本数据来说明:

表A:

SUM

表B:

AID
 1
 2
 3

表C:

BID AID
 1   1
 2   1
 3   1
 4   2
 5   2
 6   2
 7   3
 8   3
 9   3

您可以使用:

CID BID Price
 1   1   12
 2   2   12
 3   3   20
 4   4   2
 5   5   1
 6   6   12
 7   7   22
 8   8   21
 9   9   23

观察到此处没有总和。

这会给你结果:

SELECT  ab.AID,
        c.Price
 FROM (SELECT       a.aid, MAX(b.BID) AS maxB
       FROM         a a
       INNER JOIN   b b ON a.AID = b.AID
       GROUP BY     a.AID
      ) ab
INNER JOIN C c ON ab.maxB = c.BID

你可以在这里看到 - > http://sqlfiddle.com/#!9/4943cd/3

戈登的回答也会给你相同的结果 - > http://sqlfiddle.com/#!9/4943cd/2

您可以看到,无论是否使用AID PRICE 1 20 2 12 3 23 ,结果都是相同的。

注意:但是,Gordon的答案(这里是明确的答案)是不正确的,因为它没有考虑如果从表A中删除任何值,那么结果集将具有冗余值

如果您稍微更改原始数据集,可以观察到这一点:

表A:

SUM

表B:

AID
 1

表C:

BID AID
 1   1
 2   1
 3   1
 4   2
 5   2
 6   2
 7   3
 8   3
 9   3

戈登的询问会产生结果:

CID BID Price
 1   1   12
 2   2   12
 3   3   20
 4   4   2
 5   5   1
 6   6   12
 7   7   22
 8   8   21
 9   9   23

这是不正确的,因为没有AID值2和3。

您需要在表A上加入以获取表A中当前存在的 AID值。

希望这有帮助!!!

答案 1 :(得分:1)

以下应该做你想做的事:

select b.aid, sum(c.price)
from b join
     c
     on c.bid = b.bid
where b.bid = (select max(b2.bid) from b b2 where b2.aid = b.aid)
group by b.aid;

join将表格合并在一起。请注意,a不是必需的 - 除非您希望来自a的行b中没有相应的行(在这种情况下,a将首先带left join 1}})。

where子句为每个b选择最新的aid条记录。 group by用于获得总和。