Normalmente, usaríamos asserções de antecipação positivas para esta tarefa, mas o mecanismo regex do MySQL não os suporta.
Portanto, sua única opção (se você quiser fazer isso em um único regex) é lidar com ambas as variações (
hello depois de red ou hello antes de red ) "manualmente":hello.*red|red.*hello
Para duas "palavras de pesquisa", isso provavelmente é aceitável - no entanto, não é dimensionado bem.
Sua regex
((hello|red).*){2}()* é um pouco estranho; Isso significa ( # Start of group:
(hello|red) # Match either hello or red
.* # Match any number of characters
){2} # Match this group twice
()* # Match the empty string any number of times...
então isso corresponde a
hello foo hello ou red bar red também.