Vanligtvis skulle man använda positiva framsyningspåståenden för denna uppgift, men MySQL:s regexmotor stöder dem inte.
Därför är ditt enda alternativ (om du vill göra detta i ett enda regex) att hantera båda varianterna (hello efter red eller hello före red ) "manuellt":
hello.*red|red.*hello
För två "sökord" är det förmodligen acceptabelt - det skalar dock inte bra.
Ditt regex ((hello|red).*){2}()* är lite konstigt; det betyder
( # 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...
så det här matchar hello foo hello eller red bar red likaså.