0

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

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 中是否有合理的方法来做到这一点?任何帮助表示赞赏。

4

1 回答 1

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 函数或卷积(提示:如果你不分析基因组,那么看看一些代码)。

于 2012-04-29T21:25:59.087 回答