0

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

我可以通过将它分成两个视图来使这个查询工作,但我想知道是否有某种方法可以将它压缩成一个视图。我知道的唯一语法是在'from'子句下包含select,但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视图:

SELECT
  a.*,
  mr.lastModified AS lastModified,
  mr.realmId AS realmId,
 FROM (
    Auctions AS a
   JOIN mostRecentUpdates AS mr
    ON (a.updateId = mr.auId)
  )
  ORDER BY
   a.updateId

如果我将第一个选择放到第二个的 JOIN 中,它不会保存为视图。我只是想知道是否还有其他方法可以执行此查询,以便可以将其压缩为一个视图而不是其中的两个?

4

3 回答 3

0

您可以将其编写为单个查询,只需使用joins:

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 来获取每次拍卖的最后修改日期。其余的只是加入这个信息。

这行得通吗?

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
于 2013-02-27T19:15:57.107 回答
0

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

于 2013-02-27T20:45:33.227 回答
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

我只是在脑海中以错误的顺序连接。首先加入两个表,然后搜索与最大值匹配的表,而不是找到最大值然后加入结果。

于 2013-02-27T20:53:52.900 回答