簡化,我得到了以下情況。我有兩張桌子。一次遷移通過checks.migration_id
進行多次檢查。列checks.old
描述了一種檢查。現在我想爲每次遷移獲得支票,其中old
爲true(query1)和false(query2)的時間最長。取得最新的兒童記錄沒有給定
約有30.000次遷移,每次約有1000次檢查,其中old = true,1000次檢查old = false。表格檢查會變得非常極端。沒有給出支票的順序,可能會完全混淆。
我想一次獲得最多150次遷移的最新檢查。
SQL小提琴:http://sqlfiddle.com/#!15/282ce/15
我使用PostgreSQL 9.3和Rails 3.2(不應該的問題)
請告訴我最有效的方式來獲得最新的子記錄,其中舊=真的嗎?
表遷移:
| ID |
|----|
| 1 |
| 2 |
表檢查:
| ID | MIGRATION_ID | OLD | OK | TIME |
|----|--------------|-----|----|----------------------------------|
| 1 | 1 | 1 | 1 | September, 22 2014 12:00:01+0000 |
| 2 | 1 | 0 | 1 | September, 22 2014 12:00:02+0000 |
| 3 | 2 | 1 | 1 | September, 22 2014 12:00:01+0000 |
| 4 | 2 | 0 | 1 | September, 22 2014 12:00:02+0000 |
| 5 | 1 | 1 | 1 | September, 22 2014 12:00:03+0000 |
| 6 | 1 | 0 | 1 | September, 22 2014 12:00:04+0000 |
| 7 | 2 | 1 | 1 | September, 22 2014 12:00:03+0000 |
| 8 | 2 | 0 | 1 | September, 22 2014 12:00:04+0000 |
查詢1應該返回以下結果:
| Migration.id | Check_ID | OLD | OK | TIME |
|--------------|----------|-----|----|----------------------------------|
| 1 | 5 | 1 | 1 | September, 22 2014 12:00:03+0000 |
| 2 | 7 | 1 | 1 | September, 22 2014 12:00:03+0000 |
查詢1應該返回以下結果:
| Migration.id | Check_ID | OLD | OK | TIME |
|--------------|----------|-----|----|----------------------------------|
| 1 | 6 | 0 | 1 | September, 22 2014 12:00:04+0000 |
| 2 | 8 | 0 | 1 | September, 22 2014 12:00:04+0000 |
我試圖用子查詢中的最大值來解決它,但後來我丟失了關於checks.ok
和check.time的信息。
SELECT eq.id, (SELECT max(checks.id) FROM checks WHERE checks.migration_id = eq.id and checks.old = 't') AS latest FROM migrations eq;
SELECT eq.id, (SELECT max(checks.id) FROM checks WHERE checks.migration_id = eq.id and checks.old = 'f') AS latest FROM migrations eq;
(我知道我得到的max(id)
代替max(time)
)
在Rails我想每個遷移取這就造成了1 + N問題的最新記錄。我無法包含所有支票,因爲有很多方法。
非常好的工作,第一個問題!小提琴特別受歡迎。 – 2014-09-22 17:01:20