2

我有两个表(在 mysql 中),BookBookPrice存储书籍的价格(随着时间的推移)。BookPrice

我想要一个显示 Book 数据及其当前价格的视图。

表结构是:

    BookId PK Int AI,
    BookTitle varchar(255)

书价

    Id PK Int AI
    BookId Int (FK to Book)
    Price decimal(8,2)
    LastModified datetime

样本数据

    1, Harry Potter
    2, LOTR
    3, Game of Thrones
    4, 50 Shades of Gray

书价

    1, 1, 5.00, 2012-01-01 00:00:00
    2, 2, 10.00, 2012-01-01 00:00:00
    3, 3, 7.00, 2012-01-01 00:00:00
    4, 4, 0.99, 2012-01-01 00:00:00
    5, 1, 8.00, 2012-02-01 00:00:00
    6, 2, 9.00, 2012-02-01 00:00:00

有了这些数据,视图应该显示:

    BookId, Title, Price, PriceLastModified
    1, Harry Potter, 8.00, 2012-02-01 00:00:00
    2, LOTR, 9.00, 2012-02-01 00:00:00
    3, Game of Thrones, 7.00, 2012-01-01 00:00:00
    4, 50 Shades of Gray, 0.99,, 2012-01-01 00:00:00

我已经尝试过(许多变体)以下内容:

SELECT `Book`.`Id`, `Book`.`Title`, `BookPrice`.`Price`, `BookPrice`.`LastModified`
FROM `Book` 
LEFT JOIN `BookPrice` ON `BookPrice`.`BookId` = `Book`.`Id`
GROUP BY `Book`.`Id`
ORDER BY `BookPrice`.`LastModified` DESC

然而,这似乎是 Group then Order,意思是 Groups,为每本书选择第一个价格(不是最新的),所以我得到:

1, Harry Potter, 5.00, 2012-01-02 00:00:00

而不是正确的

1, Harry Potter, 8.00, 2012-02-01 00:00:00

和 LOTR 一样

我设法使用子查询而不是联接来使其工作(不知道这在性能方面有多好),但随后无法从该语句创建视图,因为视图在选择中不能有子查询陈述。

有办法解决这个问题吗?还是我必须创建一个“未分组”视图,然后创建第二个视图来对第一个视图进行分组?

我知道这类似于之前在 SO 上提出的问题,并且查看了许多其他问题,但找不到相同的问题(或处理视图)

4

1 回答 1

3

您可以在子查询中获得最大值lastModifed,然后将其再次加入原始查询。

SELECT  a.*,b.*
FROM    book a
        INNER JOIN bookPrice b
            on a.bookid = b.bookid
        INNER JOIN
        (
            SELECT bookID, MAX(lastModified) maxLast
            FROM bookPrice
            GROUP BY bookID
        ) c
            ON  b.bookid = c.bookid and
                b.lastmodified = c.maxlast
ORDER BY a.bookID

SQLFiddle 演示

更新 1

您没有提到您将View从此查询创建一个。基本上,VIEWs 不能包含子查询。最好的方法是创建一个VIEW子查询

CREATE VIEW LastModifiedList
AS
SELECT bookID, MAX(lastModified) maxLast
FROM bookPrice
GROUP BY bookID

并加入此视图以创建另一个视图。

CREATE View BookLatestPriceList
AS
SELECT  a.*,b.*
FROM    book a
        INNER JOIN bookPrice b
            on a.bookid = b.bookid
        INNER JOIN LastModifiedList c  -- <== view of the subquery
            ON b.bookid = c.bookid and
                b.lastmodified = c.maxlast

SQLFiddle 演示

于 2012-09-20T11:07:27.317 回答