2013-02-27 75 views
0

当我遇到了一个创建所需视图的问题时,我在使用魔兽拍卖API来测试一些mysql概念时玩弄了一些沙箱代码。 我设置了两个表格,一个用于存储来自暴风雪的实际数据,第二个用于保存跟踪“lastModified”日期戳记,每当我拉更新。每个拍卖条目都标有'updateId',该'updateId'指向具有给定'lastModified'戳的另一个表。我想要做的是编写一个视图来查找MAX的所有updateIds(lastModified),然后返回与该updateId匹配的所有拍卖记录。mysql抱怨子查询从查看

我能够通过将此查询拆分为两个意见,但我想知道是否有某种方法可以将它凝聚成一个单一的视图。

mostRecentUpdates观点:

SELECT 
    au.auctionUpdateId as auId, 
    au.lastModified, 
    au.realmId, 
    au.house 
FROM 
    `AuctionUpdates` AS au 
WHERE 
    (
    au.`lastModified` = (
     SELECT 
     MAX(lastModified) 
     FROM 
     `AuctionUpdates` 
    ) 
) 

mostRecentAuctions鉴于我所知道的是,包括“从”条款下的选择,但MySQL的似乎不是唯一的语法创建视图的时候喜欢:

​​

如果我把第一个select放到第二个JOIN上,它将不会保存为视图。我只是想知道是否有其他的方式来做这个查询,所以它可以凝聚成一个单一的视图,而不是其中两个?

SELECT a.*, 
     au.lastModified AS lastModified, 
     au.realmId AS realmId, 
FROM Auctions a join 
    AuctionUpdates au 
    ON a.updateId = mr.auId join 
    (select auId, MAX(lastModified) as maxLastModified 
     from AuctionUpdates au 
     group by auId 
    ) alm 
    on au.LastModified = alm.maxLastModified and 
     au.auId = alm.auId 
ORDER BY a.updateId 

的关键是在子查询中使用GROUP BY以获取每次拍卖的最后修改日期:

回答

0

你,你可以写为单个查询,只是用join秒。其余的只是加入这些信息。

这是行不通的?

SELECT a.*, 
     au.lastModified AS lastModified, 
     au.realmId AS realmId, 
FROM Auctions a join 
    AuctionUpdates au 
    ON a.updateId = mr.auId 
where lastModified = (select max(LastModified) 
         from AuctionUpdates au2 
         where au.auID = au2.auID 
        ) 
ORDER BY a.updateId 
+0

是的,但这是我第一次尝试。我试图将它创建为视图,以便将其保存以供日后参考。当你把选择放在'From'下时,它会抱怨并不会保存它。 错误1349 - 视图的SELECT在FROM子句 – Scott 2013-02-27 20:33:27

+0

中包含一个子查询,我意识到它的确如此工作 - 我可以很好地预览它,它不会以这种方式保存。 – Scott 2013-02-27 20:38:15

+0

@Scott。 。 。现在我记得那种神秘而莫名的限制。解释为什么我不在MySQL中使用视图。但是,看看我修改后的答案。 – 2013-02-27 20:44:54

0

只要您创建子查询作为视图,然后引用该视图,就可以在视图中使用子查询。

0

好的,我终于明白了。

SELECT 
    a.*, 
    au.lastModified, 
    au.realmId 
FROM 
    Auctions AS a 
    INNER JOIN 
    AuctionUpdates AS au 
    ON 
    au.auctionUpdateId = a.updateId 
WHERE 
    (au.lastModified = (SELECT MAX(lastModified) FROM AuctionUpdates)) 
ORDER BY 
    a.updateId ASC 

我只是在我的脑海错误的顺序加入:咄,有一次我终于看到了如何将其在这两个查询了几次会后安排是不是太困难。首先加入两个表格,然后搜索与最大值匹配的值,而不是查找最大值,然后加入结果。