2016-12-15 3 views
1

によって選択行:MySQLの:私はジョナサンは、この例では探していたものの正反対を探しています2〜3の主キー

主キーとして3列(3番目があるが持つHow to select multiple rows by multi-column primary key in MySQL?

最近のものがなくてもすべてを選択したいと思っています。最初の2つのプライマリ値の組み合わせに対して2番目のエントリがない場合は、それをまったく選択したくありません。これを一種のバージョン管理と考えてください。テーブル構造には3つ以上の列が含まれており、行全体を選択したいと考えています。

は、次のようになります。

擬似コード
{ID1 | ID2 | DATE} | more columns ... 

SELECT * FROM table WHERE (first and second primary value are the same and exist more than once) AND NOT MAX(date) 

:D私は出力に行のすべての以前のバージョンのデータが欲しい

、最新のを含めません1。

ご協力いただきありがとうございます。手順に問題がダウン

答えて

1

ブレイク:

疑似ロジック:

  • 我々は今
  • を除外するレコードを持つデータセットを取得しますが、データセット全体
から設定することを排除

手順1:ID1、ID2の最大データを持つレコードのみのデータセットを取得する

SELECT ID1, ID2, Max(date) date 
      FROM Table 
      GROUP BY ID1, ID2 

ステップ2:このデータセットを使用して、望ましくないレコードを特定/削除します。存在しない可能性が最も高い可能性があります。

より速く...

SELECT A.* 
FROM TABLE A 
WHERE NOT EXISTS 
(SELECT 1 
FROM (SELECT ID1, ID2, Max(date) date 
     FROM Table 
     GROUP BY ID1, ID2) B 
WHERE A.ID1 = B.ID1 
    and A.ID2 = B.ID2 
    and A.Date = B.Date) 

または自己の外側など、サブセットに参加遅いが必要な場合は、サブセットに関する詳細へのアクセスを提供します。 (この例ではあまり役に立ちませんが、他の状況では役に立ちますが)

データセットへの左結合は、最大日付で一致するものを示します。したがって、他のすべてのレコードはNULLになります。これは、再...

SELECT A.* 
FROM TABLE A 
LEFT JOIN (SELECT ID1, ID2, Max(date) date 
      FROM Table 
      GROUP BY ID1, ID2) B 
    on A.ID1 = B.ID1 
and A.ID2 = B.ID2 
and A.Date = B.Date 
WHERE B.ID1 is null 
+0

うわー、それは速かった!よく説明され、働いている! :) –

+0

まだ自分のコメントを編集できないため、ここに第2のものがあります:うわー、それは速かった!よく説明され、働いている! :)最初のものは、私が探していたものを正確に示してくれました。左の結合をした2番目のものは、実際のデータに干渉する可能性のあるデータセットにNULLの列を追加します。最後の最後の解決方法では、最後の最後の解決策を見逃してしまいました。 –

+0

2番目のものではなく、*とnullの列がなくなります。私は欠けているに追加しました)null列は干渉しませんが、結合基準とwhere句に基づいて常にNULLになります。無意味なので、私はA. *を追加しました。私はあなたのデータセットを持っていないので、私たちがデータをモックアップしない限り、私たちは "テスト"する機会を得られません。 – xQbert

関連する問題