0

mysql の概念をテストするために warcraft オークション API をいじってサンドボックス コードをいじっていたところ、目的のビューを作成する際に問題が発生しました。2 つのテーブルを設定しました。1 つはブリザードからの実際のデータを格納するため、もう 1 つは更新をプルするたびに「lastModified」日付スタンプを追跡するためです。各オークション エントリは、指定された「lastModified」tstamp を持つ他のテーブルを指す「updateId」でタグ付けされます。私がやりたかったのは、MAX(lastModified) のすべての updateIds を検索するビューを作成し、その updateId に一致するすべてのオークション レコードを返すことでした。

このクエリを 2 つのビューに分割することで機能させることができましたが、1 つのビューに凝縮する方法があるかどうか疑問に思っていました。私が知っている唯一の構文は、「from」句の下に選択を含めることですが、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

最初の選択を 2 番目の JOIN にドロップすると、ビューとして保存されません。2 つではなく 1 つのビューに凝縮できるように、このクエリを実行する他の方法があるかどうか疑問に思っています。

4

3 に答える 3

0

サブクエリをビューとして作成し、それを参照する限り、ビューでサブクエリを使用できます。

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

わかりました、私はついにそれを理解しました。当たり前ですが、2つのクエリをさらに数回行った後、最終的にそれを配置する方法を確認したら、それほど難しくはありませんでした:

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

頭の中で結合の順序が間違っていました。最初に 2 つのテーブルを結合してから、最大値を見つけて結果を結合するのではなく、最大値に一致するものを検索します。

于 2013-02-27T20:53:52.900 に答える