2

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

table:App
|AppID|AppName|AppType|
   1    test     new

table:AppRelease
|AppReleaseID|AppID|ReleaseDate|ReleaseVersion|
   1            1   2012-06-20        2.2
   2            1   2012-06-19        2.3

以下に示すようにクエリを作成します。

SELECT A.*,B.ReleaseDate,B.ReleaseVersion 
FROM App as A 
  LEFT JOIN AppRelease as B ON A.AppID=B.AppID

このクエリは AppRelease テーブルの単一の値に対して機能しますが、AppRelease テーブルの複数の値に対して最後に追加された値を取得したいと考えています。単一のクエリで可能ですか?

4

3 に答える 3

4
SELECT aa.*, bb.AppReleaseID, bb.ReleaseDate
FROM App aa LEFT JOIN (
            SELECT a.AppID, a.AppReleaseID, a.ReleaseDate
            FROM AppRelease a INNER JOIN (
                        SELECT AppID, MAX(ReleaseDate) mx FROM AppRelease 
                        GROUP BY AppID
                    ) b ON a.AppID = b.AppID AND a.ReleaseDate = b.mx
        ) bb ON bb.AppID = aa.AppID

フィドル: http://sqlfiddle.com/#!2/befa2/3

于 2012-06-19T20:32:18.197 に答える
1

単一のクエリでこれを実現するには、最初にサブクエリで最大値を取得する必要があります。

SELECT A.*,B.ReleaseDate,B.ReleaseVersion 
FROM App as A 
    LEFT JOIN AppRelease as B ON A.AppID = B.AppI
WHERE B.ReleaseDate = (
    SELECT MAX(ReleaseDate)
    FROM AppRelease
    WHERE AppID = A.AppID GROUP BY AppID
    LIMIT 0, 1
) OR B.ReleaseDate IS NULL;

サブクエリを結合テーブルとして使用することで、これを行う別の方法があると思います。

于 2012-06-19T19:58:41.200 に答える
1

JOIN を使用すると、AppRelease から最大値を選択するのが最善だと思います。

SELECT A.*,MAX(B.ReleaseDate),MAX(B.ReleaseVersion)
FROM App as A
LEFT JOIN AppRelease as B ON A.AppID=B.AppID
GROUP BY A.AppID

最後に追加された値を意味的に取得したい場合は、次のようなサブクエリを使用する方がよいでしょう。

SELECT A.*,
(SELECT B.ReleaseDate FROM AppRelease as B
WHERE B.AppID=A.AppID ORDER BY B.AppReleaseID DESC LIMIT 1)
as ReleaseDate,
(SELECT B.ReleaseVersion FROM AppRelease as
B WHERE B.AppID=A.AppID ORDER BY B.AppReleaseID DESC LIMIT 1)
as ReleaseVersion
FROM App as A
于 2012-06-19T20:05:27.597 に答える