Gewoonlijk zou men positieve vooruitziende beweringen gebruiken voor deze taak, maar de regex-engine van MySQL ondersteunt ze niet.
Daarom is je enige optie (als je dit in een enkele regex wilt doen) om beide varianten af te handelen (hello na red of hello voor red ) "handmatig":
hello.*red|red.*hello
Voor twee "zoekwoorden" is dat waarschijnlijk acceptabel - het schaalt echter niet goed.
Uw regex ((hello|red).*){2}()* is een beetje vreemd; het betekent
( # 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...
dus dit komt overeen met hello foo hello of red bar red ook.