Por lo general, uno usaría afirmaciones anticipadas positivas para esta tarea, pero el motor de expresiones regulares de MySQL no las admite.
Por lo tanto, su única opción (si desea hacer esto en una sola expresión regular) es manejar ambas variaciones (hello
después de red
o hello
antes de red
) "manualmente":
hello.*red|red.*hello
Para dos "palabras de búsqueda", eso probablemente sea aceptable; sin embargo, no se escala bien.
Tu expresión regular ((hello|red).*){2}()*
es un poco extraño; 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...
entonces esto coincide con hello foo hello
o red bar red
también.