以下は私の好みのサブ選択肢が多すぎますが、すべてのティックとすべてのrefidがテーブル内で少なくとも1回は別々に発生する限り、MySQLで望ましい結果を生成します。
tickとrefidのすべてのペアを生成するクエリから始めます。次の例では、テーブルを使用してペアを生成しています。そのため、基になるテーブルにティックが表示されない場合は、生成されたペアにティックも表示されません。 refidsには同じことが当てはまりますが、「すべてのrefidsはtick = 1で値を持つ」という制限は、後者が決して起こらないようにする必要があります。これを使用する
は
SELECT tick, refid FROM
(SELECT refid FROM chadwick WHERE tick=1) AS r
JOIN
(SELECT DISTINCT tick FROM chadwick) AS t
、REFIDにequijoiningとθ ≥がダニに-joiningによってテーブルに存在する最大のダニと一緒に、すべての不足しているダニ、REFIDペアを生成します。生成されたティックごとにグループ分けする。各ペアの1つの行のみが必要であるため、refidする。既存のtick、refidのペアを除外するための鍵はHAVING
です。厳密に言えば、HAVING
を省略することができます。結果のクエリは既存の値を持つ既存の行を返します。サブセレクトとして上記からの選択最終
SELECT tr.tick, tr.refid, MAX(c.tick) AS ctick
FROM
(SELECT tick, refid FROM
(SELECT refid FROM chadwick WHERE tick=1) AS r
JOIN
(SELECT DISTINCT tick FROM chadwick) AS t
) AS tr
JOIN chadwick AS c ON tr.tick >= c.tick AND tr.refid=c.refid
GROUP BY tr.tick, tr.refid
HAVING tr.tick > MAX(c.tick)
一つは、所与ctickの値を取得するために、元のテーブルに結合テーブルに新しい行を返します。 (tick, refid)
と(refid, tick)
インデックスと共に試料台に
INSERT INTO chadwick
SELECT missing.tick, missing.refid, c.value
FROM (SELECT tr.tick, tr.refid, MAX(c.tick) AS ctick
FROM
(SELECT tick, refid FROM
(SELECT refid FROM chadwick WHERE tick=1) AS r
JOIN
(SELECT DISTINCT tick FROM chadwick) AS t
) AS tr
JOIN chadwick AS c ON tr.tick >= c.tick AND tr.refid=c.refid
GROUP BY tr.tick, tr.refid
) AS missing
JOIN chadwick AS c ON missing.ctick = c.tick AND missing.refid=c.refid
;
性能:
+----+-------------+------------+-------+-------------------+----------+---------+----------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+-------------------+----------+---------+----------+------+---------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 3 | |
| 1 | PRIMARY | c | ALL | tick_ref,ref_tick | NULL | NULL | NULL | 6 | Using where; Using join buffer |
| 2 | DERIVED | <derived3> | ALL | NULL | NULL | NULL | NULL | 9 | Using temporary; Using filesort |
| 2 | DERIVED | c | ref | tick_ref,ref_tick | ref_tick | 5 | tr.refid | 1 | Using where; Using index |
| 3 | DERIVED | <derived4> | ALL | NULL | NULL | NULL | NULL | 3 | |
| 3 | DERIVED | <derived5> | ALL | NULL | NULL | NULL | NULL | 3 | Using join buffer |
| 5 | DERIVED | chadwick | index | NULL | tick_ref | 10 | NULL | 6 | Using index |
| 4 | DERIVED | chadwick | ref | tick_ref | tick_ref | 5 | | 2 | Using where; Using index |
+----+-------------+------------+-------+-------------------+----------+---------+----------+------+---------------------------------+
Iが言ったように、あまりにも多くのサブ選択します。一時的なテーブルが問題を助けるかもしれません。
欠落ダニをチェックする:
SELECT clo.tick+1 AS missing_tick
FROM chadwick AS chi
RIGHT JOIN chadwick AS clo ON chi.tick = clo.tick+1
WHERE chi.tick IS NULL;
これは1 +テーブル内の最大目盛りに等しいティックと少なくとも一つの列を返します。したがって、この結果の最大値は無視できます。
"最近の"とは、欠けている行と同じrefidを持つ行の 'value'と' tick 'が欠落している行の 'tick'となるような最大の' tick'を意味しますか? ?完全に欠けている(すなわち、テーブルに全く現れない)「ティック」はありますか?追加する必要がありますか? – outis
@outは「最新の」「値」の定義上正しい。 (私は野生でそれを見たことはないが)正確に欠けている可能性があると信じています。 – Chadwick