2017-12-22 17 views
1

私は正しい結果に耳を傾ける単一のMySQLクエリを生成することに私の頭を包み込むために戦っています。MySQLは、特定の値の最新の行を選択してください

私は以下のように構成されているテーブルを持っている

workflow_status_history:

id reference   status 
1 308ffn3oneb Lead Received 
2 308ffn3oneb Quoted 
3 308ffn3oneb Invoiced 
4 853442ec2fc Lead Received 

あなたが見ることができるように、workflow_status_history表は、当社のシステム上の各ワークフローのすべてのステータスの履歴を保持以前のステータスを新しいステータスに置き換えたり上書きしたりするのではなく、これは、詳細なレポート作成と監査に役立ちます。ワークフローの開始ステータスは常にLead Receivedです。

問題は、しかし、私は最新またはのみステータスがLead Receivedあるのですテーブルの各行のreferenceフィールドを選択する必要があるということです。したがって、上記の例では、フィールド番号4が返されますが、フィールド12および3は、そのワークフロー参照の最新のステータスがInvoicedであるため返されません。しかし、853442ec2fc(フィールド番号4)がLead Received以外の新しいステータスを取得した場合、次回のクエリ実行時には返さないようにしてください。以下のように

私の現在のクエリは次のとおりです。

SELECT *, MAX(id) FROM workflow_status_history WHERE 'status' = 'Lead Received' GROUP BY reference LIMIT 20

このWHERE節はそれがLead Receivedステータスを持つすべての行を返すことを保証しているため、当然のことながら、関係なく、望ましい結果を返しません。それが最新の状態であるか否かを判断する。したがって、テーブル内の最初の20個のワークフロー参照が常に返されます。

希望の結果を返すために正しいクエリを作成するにはどうすればよいですか?

ありがとうございました。

+0

ステータスの変更ごとにタイムスタンプも保存していますか? – user2314737

+0

はい私はそうです。私は年代順の参照としてIDフィールドを使用していますが。 – RookieSA

答えて

2

これは、それ自身との左結合の場合です。このクエリのアイデアは次のとおりです。 ステータスが「Lead Received」で、同じ参照と高いIDを持つ行がないすべての参照を選択します。私は、あなただけの「新しい」状態、ノータイムスタンプなどが何であるかを決定するためのIDを使用すると仮定し

@Martinシュナイダーの答えが正しいですが、以下は、使用して予想される出力

を達成するために、他の2通りの方法がある

SELECT 
    DISTINCT h1.reference 
FROM 
    workflow_status_history h1 LEFT JOIN workflow_status_history h2 ON 
        h1.reference = h2.reference AND 
        h1.id < h2.id 

WHERE 
    h1.status = 'Lead Received' AND 
    h2.id IS NULL 
+0

完璧に動作します。 Martinに感謝します。 – RookieSA

1

内側は、相関副問合せを使用して、同じテーブル

select a.* 
from workflow_status_history a 
join (
    select reference,max(id) id 
    from workflow_status_history 
    group by reference 
) b using(reference,id) 
where a.status = 'Lead Received'; 

に参加

select a.* 
from workflow_status_history a 
where a.status = 'Lead Received' 
and a.id = (select max(id) 
      from workflow_status_history 
      where reference = a.reference) 

DEMO

+1

ありがとうございます。あなたとマーティンの答えがこの問題を解決しました。私はあなたがフィドルを作成するまで行ったことに感心します。完璧に動作します。 – RookieSA

関連する問題