Сортировка результатов запроса UNION, объединяющего две таблицы по таблице происхождения

Я использую оператор UNION для выбора результатов из двух разных таблиц. Я хочу, чтобы результаты из первой таблицы были раньше результатов из второй таблицы.

Например: у меня есть таблицы customer_coupons и segment_coupons. В обеих таблицах есть столбец с именем «coupon_id». Когда я запускаю запрос, включающий ОБЪЕДИНЕНИЕ этих двух таблиц, он возвращает правильные записи, но они не в том порядке, в котором я хочу: он дает мне идентификаторы купонов обеих таблиц, смешанные в порядке возрастания, но я хочу показать ВСЕ идентификаторы купонов из таблицы. первой таблицы, а затем ВСЕ ИД купонов второй таблицы.

Вот запрос, как он существует в настоящее время:

ВЫБЕРИТЕ идентификатор_купона ИЗ ОБЪЕДИНЕНИЕ_купонов_покупателя ВЫБЕРИТЕ идентификатор_купона ИЗ сегмент_купонов;

Как я могу изменить это так, чтобы все результаты первой половины запроса предшествовали всем результатам второй половины?


person Amar Banerjee    schedule 24.05.2013    source источник
comment
тогда вы можете использовать порядок по предложению.   -  person Drew    schedule 24.05.2013
comment
Если вы хотите отобразить все идентификаторы купонов из обеих таблиц, в вашем примере запроса следует использовать union all, а не union. union удаляет дубликаты.   -  person Gordon Linoff    schedule 24.05.2013


Ответы (1)


Поместите в фиксированное поле, идентифицирующее таблицу:

(SELECT 1 AS source_table, coupon_id
FROM customer_coupons)

UNION ALL

(SELECT 2 AS sourcE_table, coupon_id
FROM segment_coupons)

ORDER BY source_table, coupon_id

Обратите внимание на скобки вокруг отдельных запросов. Это заставляет MySQL применять order by к результату объединения, а не к подзапросу 2.

person Marc B    schedule 24.05.2013
comment
Зачем нужен союз, добавление исходной_таблицы предотвращает дублирование; если мы не считаем, что в самих таблицах есть дубликаты... - person xQbert; 24.05.2013
comment
Сила привычки. Меня слишком часто кусали не-all запросы. - person Marc B; 24.05.2013