データベース構造に問題があります!
リレーショナルデータベースに関しては、常に1つのことを覚えておく必要があります。それは、行の一般的または自動の順序付けがないことです。
つまり、クエリの出力の順序に依存することはできません。問題は次のとおりです。DBMSはクエリを最適化し、呼び出さない場合ORDER BY
、行を返す順序が定義されていません。(常に同じ順序であるように見えても、DBMSをアップグレードするか、単に中国で米の袋が倒れたために変更される可能性があります)。それに頼らないでください!
したがって、論理的な解決策は1つだけsubmissionstate
です。つまり、自動生成された主キーまたはタイムスタンプのいずれかである、テーブルの3番目の列です。作成の時間が必要ない場合は、主キーを使用してください。
次に、テーブルは次のようになります。
id | submission_id | state_id
-----------------------------
1 | 4 | 3
2 | 8 | 3
3 | 4 | 2
4 | 6 | 1
5 | 4 | 5
6 | 8 | 0
私があなたを正しく理解していれば、あなたはそれらの結果を望んでいます:
submission_id = 4
あなたが受け取りたいものを探しているならstate_id = 5
submission_id = 8
あなたが受け取りたいものを探しているならstate_id = 0
submission_id = 6
あなたが受け取りたいものを探しているならstate_id = 1
右?
解決策:
したがって、id
フィールドが指定されている場合、探しているクエリは次のとおりです。
SELECT submission_id, state_id
FROM submissionstates ss
JOIN (
SELECT MAX(id) as id
FROM submissionstates ss
GROUP BY submission_id
) x
ON ss.id = x.id
現在のstate_id=0の行のみが必要な場合は、次のようにします。
SELECT submission_id, state_id
FROM submissionstates ss
JOIN (
SELECT MAX(id) as id
FROM submissionstates ss
GROUP BY submission_id
) x
ON ss.id = x.id
WHERE state_id = 0
すでにcreated_at列がある場合は、id列の代わりにそれを使用します。
SELECT submission_id, state_id
FROM submissionstates ss
JOIN (
SELECT MAX(created_at) as created_at
FROM submissionstates ss
GROUP BY submission_id
) x
ON ss.created_at = x.created_at
WHERE state_id = 0