Di solito, si usano asserzioni lookahead positive per questa attività, ma il motore regex di MySQL non li supporta.
Pertanto, la tua unica opzione (se vuoi farlo in un'unica espressione regolare) è quella di gestire entrambe le varianti (hello
dopo red
o hello
prima di red
) "manualmente":
hello.*red|red.*hello
Per due "parole di ricerca", probabilmente è accettabile, tuttavia non si adatta bene.
La tua regex ((hello|red).*){2}()*
è un po' strano; 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...
quindi questo corrisponde a hello foo hello
o red bar red
anche.