MySQL: найти последовательный шаблон на нескольких строках - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь найти строки в таблице, которая следует определенному шаблону.Например, есть таблица с тремя столбцами, ID, PRODUCT_ID и ACTION соответственно.

ID PRODUCT_ID ACTION

1 A001 ABC2 A001 DHI3 A001 FGH4 B111 FGH5 A001 JKL6 A001 ZAB

Я хотел бы получить записи, имеющие 3 действия по порядку, ABC-FGH-ZAB для того же PRODUCT_ID.Из приведенного выше примера я хотел бы получить строки с идентификаторами 1, 3 и 6 в качестве ответа, а строку с идентификатором 4 следует игнорировать, поскольку она имеет другой PRODUCT_ID.Как мне сформулировать запрос, чтобы иметь набор результатов, как показано ниже для MySQL?

ID PRODUCT_ID ACTION

1 A001 ABC3 A001 FGH6 A001 ZAB

Я стараюсь не использовать вложенный запрос, если только мне не нужно по соображениям производительности.Порядок ДЕЙСТВИЯ важен, поэтому не следует извлекать FGH-ZAB-ABC.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 07 марта 2012
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'
0 голосов
/ 07 марта 2012

Это поможет:

 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';

Вам нужно будет указать искомый товар, так как может быть два разных товара с соответствующими наборами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...