で結合された 2 つの select ステートメントがありますUNION ALL
。最初のステートメントの where 句は、以前にユーザーに表示された行のみを収集します。2 番目のステートメントは、ユーザーに表示されていないすべての行を収集するため、表示された結果が最初に表示され、その後に表示されていない結果が表示されます。
もちろん、これは単純な を使用した同じ select ステートメントで簡単にORDER BY
実現できますが、2 つの別個の select の理由は単純です。
次の構造とデータを検討してください。
+----+------+-----+--------+------+
| id | from | to | viewed | data |
+----+------+-----+--------+------+
| 1 | 1 | 10 | true | .... |
| 2 | 10 | 1 | true | .... |
| 3 | 1 | 10 | true | .... |
| 4 | 6 | 8 | true | .... |
| 5 | 1 | 10 | true | .... |
| 6 | 10 | 1 | true | .... |
| 7 | 8 | 6 | true | .... |
| 8 | 10 | 1 | true | .... |
| 9 | 6 | 8 | true | .... |
| 10 | 2 | 3 | true | .... |
| 11 | 1 | 10 | true | .... |
| 12 | 8 | 6 | true | .... |
| 13 | 10 | 1 | false | .... |
| 14 | 1 | 10 | false | .... |
| 15 | 6 | 8 | false | .... |
| 16 | 10 | 1 | false | .... |
| 17 | 8 | 6 | false | .... |
| 18 | 3 | 2 | false | .... |
+----+------+-----+--------+------+
基本的に、表示されていないすべての行がステートメントによって選択されることを望みます。これは、viewed
列がtrue
orの天気をチェックすることによって達成されfalse
ます。非常にシンプルで簡単で、ここで心配する必要はありません。
ただし、既に表示されている行、つまり columnviewed is TRUE
に関しては、これらのレコードについては、グループごとに 3 行のみが返されるようにします。
この場合の適切な結果は、各グループの最新の 3 行です。
+----+------+-----+--------+------+
| id | from | to | viewed | data |
+----+------+-----+--------+------+
| 6 | 10 | 1 | true | .... |
| 7 | 8 | 6 | true | .... |
| 8 | 10 | 1 | true | .... |
| 9 | 6 | 8 | true | .... |
| 10 | 2 | 3 | true | .... |
| 11 | 1 | 10 | true | .... |
| 12 | 8 | 6 | true | .... |
+----+------+-----+--------+------+
理想的な結果セットからわかるように、3 つのグループがあります。したがって、表示された結果の目的のクエリは、検出されたグループごとに最大 3 行を表示する必要があります。この場合、これらのグループは 10 と 1 および 8 と 6 で、どちらも 3 つの行を表示する必要がありましたが、他のグループ 2 と 3 では 1 つの行しか表示できませんでした。
from = x
ここでandは、 andto = y
であるかのように同じグループ化を行うことに注意してfrom = y
くださいto = x
。したがって、最初のグループ分け (10 と 1) を考えると、 と が であった場合、とfrom = 10
はto = 1
同じグループです。from = 1
to = 10
ただし、テーブル全体にはたくさんのグループがあり、それぞれの最新の 3 つだけが select ステートメントで返されることを望んでいます。それが私の問題です。ある時点で、数千ではないにしても数百のレコードを持つことになります。
ご協力いただきありがとうございます。
注:列id
、from
、to
およびviewed
はインデックス化されており、パフォーマンスに役立ちます。
PS:この質問に正確に名前を付ける方法がわかりません。より良いアイデアがある場合は、ゲストになってタイトルを編集してください。