Esta é a sua solução:
SELECT *
FROM
(
**(**
SELECT profileId
FROM
(
SELECT profileId
FROM profile profile2
WHERE profile2.profilePublishDate <= Now()
ORDER BY profile2.profilePublishDate DESC
LIMIT 0,40
) AS profile1
ORDER BY RAND()
LIMIT 0,20
**)**
UNION
(
SELECT profileId
FROM profile profile4
WHERE profileId NOT IN (
SELECT profileId
FROM profile profile4
WHERE profile4.profilePublishDate <= Now()
ORDER BY profile4.profilePublishDate DESC
LIMIT 0,40
)
ORDER BY RAND()
LIMIT 0,40
)
) TEMP
ORDER BY RAND();
As alterações que fiz são:
- cada uma de suas consultas que fazem parte de UNION deve ser colocada entre colchetes (mostrada em negrito para a primeira consulta; a segunda já está dentro)
- removeu o alias
profile3
para sua segunda consulta - para o
ORDER BY RAND()
final , você deve criar o conjunto de resultados UNION para uma tabela derivada; Eu deiTEMP
como o alias
Eu não testei a consulta acima, mas espero que funcione. Deixe-me saber suas descobertas.