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.