0

2つのID参照フィールドNEW_REF、Orginal_REFを持つトランザクションテーブルがあります。したがって、このトランザクションテーブルでは、実際に1つのイベントに関連する複数のトランザクションを持つことができます。新しいイベントが追加されると、NEW_REFが取得され、Original_REFフィールドはnullになります。このイベントに関して何らかの変更があった場合、新しいレコードが作成され、新しいレコードのOriginal_REFが以前のNEW_REFIDの更新になります。

例として、私のテーブルには次のようなものがあります。

REF1 | Original_Ref
 956 | 200
 960 | null
 967 | 960
 980 | 967
 990 | 600
 991 | 700
 992 | 670
 998 | 343
1000 | 980
1001 | 778
1010 | 787
1020 | 565

たとえば、イベントに複数の関連するトランザクションがある場合、イベントごとにすべての関連するトランザクションを引き出すクエリを作成できるようにしたいと思います。上記の例では、次のように表示されます。

REF1 | Original_Ref
 960 | null
 967 | 960
 980 | 967
1000 | 980

ここでRecords960は元のレコードであり、3回更新されています。イベントごとに関連するトランザクションを識別してグループ化するためにテーブルを検索する方法はありますか?

4

2 に答える 2

0

これはおそらく、要件を満たす最速のクエリです。結果レコードを「トランザクション グループ」でグループ化しないことに注意してください。この場合、SQL だけを使用してこのような順序付けを行うのは非常に困難です。(両方の列に別のインデックスが既にあると仮定しています。そうでない場合は、そうしないと、このクエリのパフォーマンスが非常に低下します。)

SELECT a.REF1, a.Original_Ref

FROM txn AS a

LEFT JOIN txn AS b
ON a.Original_Ref = b.REF1

LEFT JOIN txn AS c
ON c.Original_Ref = a.REF1

WHERE b.REF1 IS NOT NULL
   OR c.Original_Ref IS NOT NULL;

相関サブクエリでもこれを行うことができますが、MySQL はそれらを結合として最適化するのが苦手なことで有名です。

于 2012-07-26T17:24:45.853 に答える
0

テーブルが構造化されているため、ネストされたサブクエリを実行する必要があります。ツリーが約 3 ノードよりも深くなると、ひどくなります。次のようなテーブル構造を考えることができます。

id int unsigned auto_increment primary key,
parent_id int unsigned,
root_id int unsigned not null

最初のイベント レコードは次のようになります200, null, 200。最初の子は547, 200, 200. n 番目の子は1038, 986, 200.

したがって、イベントのすべてのレコードに対するクエリは単純です。

SELECT * FROM mytable WHERE root_id= ?
于 2012-07-26T17:20:37.463 に答える