MySQL检测字段顺序模式?

时间:2012-04-29 20:40:34

标签: mysql

所以我有一个看起来像这样的表:

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

我要做的是在tid列中找到一个序数字段模式,然后在同一列中搜索该模式的其他实例。例如:

我查询显示单个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也可以。)

我想在第二个查询中检查模式。模式值可以间隔开,但必须按顺序显示:

                           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中有没有合理的方法呢?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

通常,这种操作在行之间不能很好地工作 - 首先将它拉入每个cid的单个记录中:

 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, '%');

您可能想看看levenstein函数或卷积(提示:如果您不分析基因组,那么请查看一些代码)。