【问题标题】:mysql complains about subquery in from for viewmysql 在视图中抱怨子查询
【发布时间】:2013-02-27 18:45:18
【问题描述】:

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

我能够通过将这个查询拆分为两个视图来使其工作,但我想知道是否有某种方法可以将它压缩为一个视图。我知道的唯一语法是在'from'子句下包含select,但mysql在创建视图时似乎不喜欢这样:

最近更新视图:

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

最近的拍卖视图:

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 中,它不会保存为视图。我只是想知道是否有其他方法可以执行此查询,以便可以将其压缩为一个视图而不是其中的两个?

【问题讨论】:

    标签: mysql select view subquery


    【解决方案1】:

    您,您可以将其编写为单个查询,只需使用 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
    

    【讨论】:

    • 是的,但这是我第一次尝试的。我正在尝试将其创建为视图,以便将其保存以供以后参考。当您将 Select 放在“From”下时,它会抱怨并且不会保存它。错误 1349 - 视图的 SELECT 在 FROM 子句中包含子查询
    • 我知道它确实可以这样工作 - 我能够很好地预览它,但它不会那样保存。
    • @Scott。 . .现在我想起了那个神秘莫名的限制。解释了为什么我不在 MySQL 中使用视图。但是,看看我修改后的答案。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      好吧,我终于想通了。呵呵,把这两个查询多翻了几遍,终于知道怎么排了,也不是太难了:

      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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 2013-11-06
        • 2021-11-16
        • 2014-10-14
        • 1970-01-01
        相关资源
        最近更新 更多