MySQL - выбор следующего элемента в последовательности на основе предыдущих последовательностей - PullRequest
0 голосов
/ 07 июня 2019

У меня есть таблица, в которой хранятся значения, если они появились вместе в последовательности. Например:

value_a | value_b | count
-------------------------
   1    |   2     |   5
   1    |   3     |   4
   2    |   3     |   7

Счетчик хранит количество раз, которое value_b видели после value_a Используя это, я могу создать вероятностную последовательность. Например, я могу выбрать любое случайное значение для запуска последовательности - в данном случае 1 - и выбрать значения, которые следовали за ним до:

> SELECT value_b FROM values WHERE value = 1

value_b
-------
   2
   3

Моя последовательность теперь 1, 2

Что я хотел бы сделать, это добавить дополнительный поиск. Если у меня есть значение - 2 в этом случае - я хочу выбрать любые значения, которые следуют за ним, но только в той последовательности, которая у меня уже есть:

SELECT value_b FROM values WHERE value = 2 
AND 
* magic line to only include to cases where 2 also followed 1 *

Можно ли это сделать без изменения схемы или я уже потерял нужную мне информацию (как я подозреваю)?

Если мне нужно изменить схему, чтобы добавить дополнительное измерение, можно ли ее структурировать таким образом, чтобы можно было просто оглянуться назад на 3 или более уровней?

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Будет получена последовательность из трех значений, начиная с определенного значения. Удалите предложение WHERE, чтобы получить полный список всех трех последовательностей значений. Он не будет отображать последовательности с значениями меньше или больше 3.

SELECT
    a.`value_a` as `seq_1`,
    a.`value_b` as `seq_2`,
    b.`value_b` as `seq_3`
FROM `values` a
JOIN `values` b
ON a.`value_b` = b.`value_a`
WHERE a.`value_a` = 1
GROUP BY a.`value_a`, a.`value_b`, b.`value_b`
ORDER BY a.`value_a`, a.`value_b`, b.`value_b`;
0 голосов
/ 07 июня 2019

Почему бы не другое соединение в таблице значений, например

select v1.value_b, v2.value_b from values v1
inner/left join values v2 on v1.value_2=v2.value_1
where v1.value_1=1

Вам нужно будет использовать left / inner, зависимый, если вы хотите или не хотите строки, где не найдено следующее значение.Если вам нужно более одной итерации, вам нужно использовать больше соединений.

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