2012-04-29 57 views
0

所以我有一個表,看起來像這樣:MySQL檢測字段順序模式?

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

我所試圖做的是找到在TID列序場模式,然後搜索在同一列該模式的其他實例。例如:

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

的模式是建立在TID列:

我查詢顯示單個CID的所有TIDS,通過降分值排序909,119,221,765。現在,我想找出該模式的其他可能實例,其中cid值是其他值。 (注:不同的cids可以有相同的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中?任何幫助讚賞。

+0

你還沒有真正明確指出'instances'列的作用。如果你有'119,221,765,909'呢?是不是909不合適,還是119,221和765不合適?您需要更多地解釋如何在各種情況下使用此列。 –

回答

0

Gnerally這種操作並不跨行很好地工作 - 開始拉入每個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, '%'); 

你可能想看看萊文施泰因功能或卷積(提示:如果你不分析基因組,然後看看一些代碼,做)。

+0

好主意。我沒有想過使用GROUP_CONCAT。謝謝。 – kevmer136