Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:查找多行上出现的顺序模式_Mysql_Design Patterns_Sequential - Fatal编程技术网

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

MySQL:查找多行上出现的顺序模式,mysql,design-patterns,sequential,Mysql,Design Patterns,Sequential,我试图在表中查找遵循特定模式的行。 例如,有一个表有三列,分别是ID、PRODUCT\u ID和ACTION IDPRODUCT_IDACTION 1A001ABC 2A001DHI 3A001FGH 4B11FGH 5A001JKL 6A001ZAB 我想为同一个PRODUCT_ID检索按顺序有3个动作的记录ABC-FGH-ZAB。从上面的示例中,我想得到ID为1、3和6的行作为答案,ID为4的行应该被忽略,因为它有一个不同的PRODUCT_ID。我如何制定一个查询,以便在MySQL上获得如下

我试图在表中查找遵循特定模式的行。 例如,有一个表有三列,分别是ID、PRODUCT\u ID和ACTION

IDPRODUCT_IDACTION

1A001ABC
2A001DHI
3A001FGH
4B11FGH
5A001JKL
6A001ZAB

我想为同一个PRODUCT_ID检索按顺序有3个动作的记录ABC-FGH-ZAB。从上面的示例中,我想得到ID为1、3和6的行作为答案,ID为4的行应该被忽略,因为它有一个不同的PRODUCT_ID。我如何制定一个查询,以便在MySQL上获得如下结果集

IDPRODUCT_IDACTION

1A001ABC
3A001FGH
6A001ZAB

我尽量不使用嵌套查询,除非出于性能原因必须使用。操作顺序很重要,因此不应检索FGH-ZAB-ABC


提前感谢

这样就可以了:

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'
 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具有匹配集。

这将实现以下目的:

 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具有匹配集。

非常感谢您的快速回答。当您回答我的问题时,我编辑了我的问题以在表中再添加一列(PRODUCT_ID)。如何更改查询以满足我添加的另一个条件?@user1253337我已更新答案以包含新列。。。如果这是有帮助的,非常感谢您更新的答案。你的提问很有效!我担心的一件事是,我正在处理的表几乎有100万条记录,因此查询中的三重连接可能会导致任何性能问题。@user1253337就性能而言,如果您的表上有良好的索引,那么100万条记录不会引起太多问题……非常感谢您的快速回答。当您回答我的问题时,我编辑了我的问题以在表中再添加一列(PRODUCT_ID)。如何更改查询以满足我添加的另一个条件?@user1253337我已更新答案以包含新列。。。如果这是有帮助的,非常感谢您更新的答案。你的提问很有效!我担心的一件事是,我正在处理的表有近100万条记录,因此查询中的三重连接可能会导致任何性能问题。@user1253337就性能而言,如果您的表上有良好的索引,那么100万条记录不会引起太多问题……为什么ID为2和5的行不存在问题?@a_horse_with_no_name-ABC,FGH、ZAB是我正在寻找的预定义动作序列。它可能是等待,运行,结束或类似的东西。我应该为我的问题提供更好的行动例子。为了简单起见,我选择了3个字母的字符串。我希望这能回答你的问题。为什么ID为2和5的行不可以?@a_horse_和_no_name-ABC、FGH、ZAB是我正在寻找的预定义动作序列。它可能是等待,运行,结束或类似的东西。我应该为我的问题提供更好的行动例子。为了简单起见,我选择了3个字母的字符串。我希望这能回答你的问题。谢谢你详细的回答。我从你的询问中学到了一些新的东西。我很感激。然而,我试图找到的是一个序列的字符串(任意字符串)在一定的顺序。这可能是Mac KFC BK或类似的东西。看起来您的查询检索的是3个字母的字符串,其中3个字母按字母顺序排列。我认为我的问题不够具体,无法实现我想做的。再次感谢你的回答。希望其他人觉得有用。序列可能超过3个字符。我相信您的查询对于制定处理字符串的查询非常有帮助。很抱歉,我没有足够的声誉来点击“答案是有用的”按钮为您的工作。谢谢您的详细回答。我从你的询问中学到了一些新的东西。我很感激。然而,我试图找到的是一个序列的字符串(任意字符串)在一定的顺序。这可能是Mac KFC BK或类似的东西。看起来您的查询检索的是3个字母的字符串,其中3个字母按字母顺序排列。我认为我的问题不够具体,无法实现我想做的。再次感谢你的回答。希望其他人觉得有用。序列可能超过3个字符。我相信您的查询对于制定处理字符串的查询非常有帮助。我很抱歉,我没有足够的声誉,还没有点击“答案是有用的”按钮为您的工作。