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