2

私は 2 つのテーブル (mysql 内) を持ってBookおりBookPriceBookPriceは本の価格を (経時的に) 格納します。

Book のデータとその現在の価格を表示するビューが必要です。

テーブル構造は次のとおりです。

    BookId PK Int AI,
    BookTitle varchar(255)

予約価格

    Id PK Int AI
    BookId Int (FK to Book)
    Price decimal(8,2)
    LastModified datetime

サンプルデータ

    1, Harry Potter
    2, LOTR
    3, Game of Thrones
    4, 50 Shades of Gray

予約価格

    1, 1, 5.00, 2012-01-01 00:00:00
    2, 2, 10.00, 2012-01-01 00:00:00
    3, 3, 7.00, 2012-01-01 00:00:00
    4, 4, 0.99, 2012-01-01 00:00:00
    5, 1, 8.00, 2012-02-01 00:00:00
    6, 2, 9.00, 2012-02-01 00:00:00

このデータを使用すると、ビューに次のように表示されます。

    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

ただし、これは Groups then Order に表示されます。つまり、Groups で、各本 (最新のものではない) の最初の価格を選択するので、次のようになります。

1, Harry Potter, 5.00, 2012-01-02 00:00:00

正しいのではなく

1, Harry Potter, 8.00, 2012-02-01 00:00:00

LOTRでも同じ

結合の代わりにサブクエリを使用してこれを機能させることができましたが(これがパフォーマンスの面でどれほど優れているかわかりません)、ビューは選択にサブクエリを持つことができないため、そのステートメントからビューを作成できません声明。

これを回避する方法はありますか?または、「グループ化されていない」ビューを作成してから、最初のビューをグループ化するために 2 番目のビューを作成する必要がありますか?

これはSOで以前に尋ねられた質問に似ていることを認識しており、他の多くの質問を見てきましたが、同じものを見つけることができませんでした(またはビューを扱っています)

4

1 に答える 1

3

サブクエリで最大値を取得しlastModifed、後で元のクエリに再度結合できます。

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

SQLFiddle デモ

更新 1

Viewこのクエリからを作成するとは言いませんでした。基本的に、VIEWs にサブクエリを含めることはできません。最善の方法はVIEW、サブクエリを作成することです

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

SQLFiddle デモ

于 2012-09-20T11:07:27.317 に答える