#mysql #sql #union
#mysql #sql #объединение
Вопрос:
У меня есть два запроса, которые я хотел бы добавить в MySQL. Я обнаружил, что ОБЪЕДИНЕНИЕ может помочь мне сделать это, но оно не идеально, поскольку не сохраняет порядок каждого добавленного запроса. В ясном виде я хотел бы сделать это:
(SELECT name,city FROM people WHERE xxx ORDER BY yyy)
UNION
(SELECT name,city FROM people WHERE zzz ORDER BY www)
но SQL не будет выполняться для инструкций ORDER при наличии ОБЪЕДИНЕНИЯ
Одним из решений было бы добавить фиктивное поле к каждому подзапросу и сначала упорядочить по этому полю :
(SELECT name,city,'0' as bogus FROM people WHERE xxx)
UNION
(SELECT name,city,'1' as bogus FROM people WHERE zzz)
ORDER by bogus ASC, wwwzzz
но это крайне неэффективно, поскольку запрос должен проходить через все поля для сортировки по фиктивному полю.
Знаете ли вы какой-либо обходной путь?
Спасибо
Комментарии:
1. На самом деле, это не «глубоко неэффективно». Это звучит как именно то, что вы хотите.
2. Спасибо. Что ж, каждый выбор занимает менее 1 мс (включая инструкцию ORDER). Поэтому я бы ожидал, что найдется способ добавить два за такое же количество времени. Но сортировка по фиктивному полю увеличивает время обработки до 500 мс, что, на мой взгляд, слишком много.
Ответ №1:
Вы пробовали использовать UNION ALL
вместо UNION
?
смотрите: http://dev.mysql.com/doc/refman/5.0/en/union.html
например:
(SELECT name,city,'0' as bogus FROM people WHERE xxx)
UNION ALL
(SELECT name,city,'1' as bogus FROM people WHERE zzz)
ORDER by bogus ASC, wwwzzz
Комментарии:
1. вы имеете в виду использование: (ВЫБЕРИТЕ имя, город Из списка людей, ГДЕ xxx УПОРЯДОЧЕН По yyy) ОБЪЕДИНИТЬ ВСЕ (ВЫБЕРИТЕ имя, город ИЗ списка людей, ГДЕ zzz УПОРЯДОЧЕН ПО www)? Похоже, не работает (инструкции order by, по-видимому, игнорируются).
2. вы правы …. ‘использование ORDER BY для отдельных операторов SELECT ничего не говорит о порядке, в котором строки отображаются в конечном результате, потому что ОБЪЕДИНЕНИЕ по умолчанию создает неупорядоченный набор строк’
Ответ №2:
Я полностью использую это здесь, поскольку у меня есть опыт работы только с MsSql, поэтому, пожалуйста, извините меня, если это бесполезно, но можете ли вы сохранить неупорядоченный результирующий набор во временной таблице, а затем выбрать ее с обязательным предложением order? Или аналогичным образом сделать оператор объединения вспомогательным / внутренним запросом и поместить предложение order во внешний запрос?
Ответ №3:
Во-первых, не используйте UNION
но UNION ALL
. UNION
удалит все дубликаты и, следовательно, может отсортировать данные.
Кроме того, глобальный синтаксис SQL-запроса такого рода:
sql_query: compound_statement [order_by_clause]
compound_statement: select_statement [ set_operator compound_statement ]
Поэтому вы можете использовать только ТОТ, Order By
который вычисляется после UNION
или INTERSECTION
. Используйте подзапросы, если вы хотите отсортировать частичные результаты.