MySQL:查找多行上出现的顺序模式

时间:2012-03-06 22:09:39

标签: mysql design-patterns sequential

我试图在表格中找到遵循特定模式的行。 例如,有一个表分别有三列,ID,PRODUCT_ID和ACTION。

ID PRODUCT_ID ACTION

1架A001 ABC
2 A001 DHI
3 A001 FGH
4 B111 FGH
5 A001 JKL
6 A001 ZAB

我想检索具有3个动作的记录,ABC-FGH-ZAB用于相同的PRODUCT_ID。从上面的例子中,我想获得ID为1,3和6的行作为答案,并且应该忽略ID为4的行,因为它具有不同的PRODUCT_ID。如何在MySQL上制定查询以获得如下结果集?

ID PRODUCT_ID ACTION

1架A001 ABC
3 A001 FGH
6 A001 ZAB

我尝试不使用嵌套查询,除非出于性能原因。 ACTION的顺序很重要,因此不应检索FGH-ZAB-ABC。

提前致谢

2 个答案:

答案 0 :(得分:1)

SELECT
    yt1.ID AS First,
    yt2.ID AS Second,
    yt3.ID AS Third
FROM
    YourTable yt1 
    JOIN YourTable yt2 
        ON yt2.ID > yt1.ID 
        AND yt2.Action = 'FGH' 
        AND yt2.Product_ID = y1.Product_ID
    JOIN YourTable yt3 
        ON yt3.ID > yt2.ID 
        AND yt3.Action = 'ZAB'
        AND yt3.Product_ID = y1.Product_ID
WHERE
    yt1.Action = 'ABC'

答案 1 :(得分:0)

这样可以解决问题:

 select a.id from myActions a, (select ASCII(act) n, id from myActions) c 
 where char(c.n+1)=substring(a.act,2,1) and char(c.n+2)=substring(a.act,3,1)
 and a.id=c.id;

示例中的表格是:

 create table myActions( 
   id int(11) not null auto_increment,
   act char(3),
   primary key(id))


   insert into myActions (act) values
   ('ABC'),('DHI'),('EFG'),('LMN'),('XYV'),('XYZ'),('CBA'),('HIJ')

另一种选择是程序。

表格如下:

1   ABC
2   DHI
3   EFG
4   LMN
5   XYV
6   XYZ
7   CBA
8   HIJ

结果是:1,3,4,6,8

更新: 在查询结束时添加:和productId ='A001'得到:

select a.id from myActions a, (select ASCII(act) n, id from myActions) c 
where char(c.n+1)=substring(a.act,2,1) and char(c.n+2)=substring(a.act,3,1)
and a.id=c.id and productId='A001';

您需要指定您寻找的productId,因为可能存在两个具有匹配集的不同productId。