0

したがって、次のようなテーブルがあります。

cid  |  tid  |  score
-----+-------+-------
 6   |  383  |   88
 2   |  234  |   91
 3   |  685  |   77
 5   |  543  |   97
etc...

私がやろうとしているのは、tid 列で序数フィールド パターンを見つけてから、同じ列でそのパターンの他のインスタンスを検索することです。例えば:

1 つの cid のすべての tid をスコアの降順で表示するクエリを実行します。

cid  |  tid  |  score
-----+-------+-------
 6   |  909  |  100
 6   |  119  |   99
 6   |  221  |   98
 6   |  765  |   97
etc...

tid 列でパターンが確立されます: 909、119、221、765。ここで、cid 値が別のものである、そのパターンの他の可能なインスタンスを見つけたいと思います。(注: 異なる cid が同じ tid を持つことができるため、cid 6 は tid 909 を持つことができ、cid 4 も同様です。)

2 番目のクエリでパターンを確認したい。パターン値は間隔を空けて配置できますが、順番どおりに表示する必要があります。

                           QUERY 2:    
cid  |  tid  |  score           cid    tid     score
---------------------         ---------------------
 6   |  909  |  100             5    | 909 < | 100
 6   |  119  |   99             5    | 831   |  97
 6   |  221  |   98             5    | 793   |  96
 6   |  765  |   97             5    | 435   |  96
                                5    | 404   |  95
                                5    | 119 < |  94
                                5    | 221 < |  94
                                5    | 765 < |  94

比較後、MySQL に次のような値を返してもらいたい:

cid |  tid pattern  | instances (in order)
----+---------------+----------------------
 5      909               1 (or 0)
 5      119               1 (or 0)
 5      221               1 (or 0)
 5      765               1 (or 0)

MySQLでこれを行う合理的な方法はありますか? どんな助けでも感謝します。

4

1 に答える 1

0

通常、この種の操作は行全体ではうまく機能しません。cid ごとに 1 つのレコードにプルすることから始めます。

 INSERT INTO summary (c_id, tids)
 SELECT cid, GROUP_CONCAT(tid ORDER BY score DESC)
 FROM yourtable
 GROUP BY cid;

次に、パターンが一致するかスーパーセットであるすべての組み合わせのリストを簡単に取得できます。

 SELECT a.cid, a.tids, b.cid, b.tids
 FROM summary a, summary b
 WHERE a.cid<>b.cid
 AND a.cid=6
 AND b.tids LIKE CONCAT('%', a.tids, '%');

レベンスタイン関数または畳み込みを確認したい場合があります (ヒント: ゲノムを分析していない場合は、分析しているコードを見てください)。

于 2012-04-29T21:25:59.087 に答える