MySQL:查找多行上出现的顺序模式
我试图在表中查找遵循特定模式的行。 例如,有一个表有三列,分别是ID、PRODUCT\u ID和ACTION IDPRODUCT_IDACTIONMySQL:查找多行上出现的顺序模式,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上获得如下
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个字符。我相信您的查询对于制定处理字符串的查询非常有帮助。我很抱歉,我没有足够的声誉,还没有点击“答案是有用的”按钮为您的工作。