2015-05-13 3 views
1

Я пытаюсь выполнить этот запрос:Как использовать MySQL UNION внутри UNION ALL

(
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank 
FROM club_offer co 
WHERE co.id IN (31, 791, 360, 382) 
GROUP BY offerId 
UNION 
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank 
FROM club_offer co 
WHERE co.id IN (869, 376, 201, 1246) 
GROUP BY offerId 
ORDER BY rank DESC 
) 
UNION ALL 
(
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank 
FROM club_offer co 
WHERE co.id IN (117, 168, 193, 204, 330, 377, 378, 379, 380, 381, 452, 931, 980, 1100, 1146, 1147, 1190, 1247) 
GROUP BY offerId 
ORDER BY rank DESC 
) 

Но я получаю сообщение об ошибке:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION

Таким образом, я предполагаю, что либо я использую неправильный синтаксис или Я пытаюсь сделать что-то, что нельзя сделать. Я предполагаю, что скрипт SQL для этого не нужен, скорее всего, опытные люди сразу поймут, что не так.

Может кто-нибудь помочь? Спасибо

+0

Снимите 'ORDER BY's – Lamak

+0

Не помог ..... –

+2

Почему GROUP BY, когда нет агрегатных функций используются? Кроме того, может ли MySQL иметь псевдонимы столбцов в GROUP BY? – jarlh

ответ

2

Ваша ошибка исходит из ваших круглых скобок. Вот один из способов переписать текущий запрос:

SELECT offerId, title, details, link, reference, rank 
FROM 
(
    SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank 
    FROM club_offer co 
    WHERE co.id IN (31, 791, 360, 382) 
    UNION 
    SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank 
    FROM club_offer co 
    WHERE co.id IN (869, 376, 201, 1246) 
) t 
UNION ALL 
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank 
FROM club_offer co 
WHERE co.id IN (117, 168, 193, 204, 330, 377, 378, 379, 380, 381, 
       452, 931, 980, 1100, 1146, 1147, 1190, 1247) 
ORDER BY rank DESC 

я удалил group by и order by положения из внутренних запросов, а также - не стесняйтесь добавлять обратно по мере необходимости, но order by в подзапросе будет бесполезным.

+0

Он работает, большое вам спасибо! –

0

Вы неправильно используете родительский учет: способ, которым вы помещаете в свой код, кажется, что вы пытаетесь установить порядок приоритетов между выборами объединенных statmets и это не допускается синтаксисом. Но, как было упоминание какой-то один на коментариях, вы можете:

select * from 
    (select ... from ... 
    union 
    select ... from ...) as T1 
union all 
    select ... from ... 

Где все стороны союза/объединения всех одиночное queryes.

Некоторые незначительные проблемы:
order by внутри каждого выбора не имеет смысла, если нет предела предложения.
не во всех случаях group by (с использованием MySQL пропустить хабилитат группирования функций) приводит тот же результат, что distinct