この表のすべての行を選択しようとしていますが、元のものの代わりに改訂されたIDが選択されています。したがって、ある行にリビジョンがある場合、その行ではなくそのリビジョンが選択されます。複数のリビジョン番号がある場合は、最も高いリビジョン番号が優先されます。改訂された行による自己結合とフィルタリングの実行方法
私は、出力の例表を考えると、クエリは、この優れたを説明します:
表:
+----+-------+-------------+-----------------+-------------+
| id | value | original_id | revision_number | is_revision |
+----+-------+-------------+-----------------+-------------+
| 1 | abcd | null | null | 0 |
| 2 | zxcv | null | null | 0 |
| 3 | qwert | null | null | 0 |
| 4 | abd | 1 | 1 | 1 |
| 5 | abcde | 1 | 2 | 1 |
| 6 | zxcvb | 2 | 1 | 1 |
| 7 | poiu | null | null | 0 |
+----+-------+-------------+-----------------+-------------+
所望の出力:
+----+-------+-------------+-----------------+
| id | value | original_id | revision_number |
+----+-------+-------------+-----------------+
| 3 | qwert | null | null |
| 5 | abcde | 1 | 2 |
| 6 | zxcvb | 2 | 1 |
| 7 | poiu | null | null |
+----+-------+-------------+-----------------+
revisions_max
というビュー:
SELECT
responses.original_id AS original_id,
MAX(responses.revision_number) AS revision
FROM
responses
WHERE
original_id IS NOT NULL
GROUP BY responses.original_id
私の現在のクエリ:
SELECT
responses.*
FROM
responses
WHERE
id NOT IN (
SELECT
original_id
FROM
revisions_max
)
AND
is_revision = 0
UNION
SELECT
responses.*
FROM
responses
INNER JOIN revisions_max ON revisions_max.original_id = responses.original_id
AND revisions_max.revision_number = responses.revision_number
このクエリは動作しますが、実行するために0.06
秒かかります。たった2000行のテーブルがあります。この表は、すぐに数十または数十万行に拡大し始めるでしょう。 union
の下のクエリは、ほとんどの時間がかかるものです。
このクエリのパフォーマンスを改善するにはどうすればよいですか?
Hey Douglas、あなたのコードは実行されません。 "列response_idが存在しません"。私はその後のパフォーマンスを比較することはできません。 – clapas
@clapas woops、私は作業しているテーブルから、stackoverflowのより単純なクエリの例に変換しています。私はそれを修正します。 –
テーブルにはどのようなインデックスがありますか?あなたのデータはどのように分布していますか?つまり平均リビジョン数は何ですか? – GarethD