MySQL视图:Order By then Group By(为了运气,加入了一个连接)

MySQL视图:Order By then Group By(为了运气,加入了一个连接),mysql,sql,Mysql,Sql,我在mysql Book和BookPrice中有两个表,BookPrice存储随时间变化的书籍价格 我想要一个显示图书数据及其当前价格的视图 表结构为: 书 书价 样本数据 书 书价 使用此数据,视图应显示: 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

我在mysql Book和BookPrice中有两个表,BookPrice存储随时间变化的书籍价格

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

表结构为:

书价

样本数据

书价

使用此数据,视图应显示:

    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
不过,这似乎是先分组再下单,这意味着它会分组,为每本书选择第一个价格,而不是最新的价格 所以我得到:

1, Harry Potter, 5.00, 2012-01-02 00:00:00
而不是正确的

1, Harry Potter, 8.00, 2012-02-01 00:00:00
LOTR也是如此

我使用子查询而不是联接成功地实现了这一点。我不知道这在性能方面有多好,但无法从该语句创建视图,因为视图在select语句中不能有子查询

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

我知道这与之前提出的问题类似,因此我已经研究了许多其他问题,但找不到相同的问题或处理视图

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

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
更新1

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

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

有效,除非当我尝试将其创建为视图时,我得到“1349-视图的SELECT在FROM子句中包含子查询”@mattumotu哦,是的,您不能在视图中创建子查询。您所需要做的就是创建子查询的视图,并将当前查询的子查询替换为您创建的视图。@mattumotu查看它是如何工作的。
1, Harry Potter, 8.00, 2012-02-01 00:00:00
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
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