MySQL UNION 2 запросы, содержащие ORDER BY

Я пытаюсь объединить два запроса, оба из которых содержат ORDER BY. Как я обнаружил, вы не можете заказывать по запросам, которые являются частью UNION. Тогда я просто не знаю, как еще выполнить этот запрос. Позвольте мне объяснить, что я пытаюсь сделать.

  1. Я пытаюсь выбрать 40 самых последних профилей и из этого списка выбрать случайный набор из 20. Затем я хочу объединить это с:
  2. Выбрать 40 случайных профилей, где профиль не попадает в исходные 40 наиболее последние профили, запрошенные в первом наборе.
  3. Случайным образом упорядочить весь набор из 60 записей.

Я знаю об эффективности использования функции Rand ().

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) as profile3
ORDER BY RAND()

ОБНОВЛЕНИЕ: Это решение, основанное на помощи Абхая ниже (спасибо, Абхай):

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 * FROM
            (
            SELECT profileId
            FROM profile profile4
            WHERE profile4.profilePublishDate <= Now()
            ORDER BY profile4.profilePublishDate DESC
            LIMIT 0,40
            ) AS temp2
         )
        ORDER BY RAND()    
        LIMIT 0,40
    )
) TEMP
ORDER BY RAND();
5
задан Paolo Broccardo 19 June 2011 в 09:40
поделиться