See what you get from this:
( SELECT m.*
FROM Matches m, TippingCompetitions c
WHERE m.competitionname = c.name
AND now() + INTERVAL 10 DAY > dateplayed
AND dateplayed > now() - interval c.matchtime MINUTE
)
UNION DISTINCT
( SELECT m.*
FROM Matches m, TippingCompetitions c
WHERE m.competitionname = c.name
AND round = c.nextround
AND dateplayed > now() - interval c.matchtime MINUTE
)
ORDER BY competitionname, dateplayed, division;
If that does not help, please provide
* SHOW CREATE TABLE tbl\G -- engine, indexes
* SHOW TABLE STATUS LIKE 'tbl'\G -- sizes
* EXPLAIN SELECT ...\G -- clues of inefficiencies
* SHOW VARIABLES LIKE '%buffer%'; -- cache size
and surround them with [ code ] and [ / code ]