Я хочу использовать заказ с объединением в запросе mysql. Я получаю разные типы записей на основе разных критериев из таблицы на основе расстояния для поиска на моем сайте. Первый запрос выбора возвращает данные, относящиеся к точному поиску места. Второй запрос выбора возвращает данные, относящиеся к расстоянию в пределах 5 км от места поиска. Третий запрос выбора возвращает данные, относящиеся к расстоянию в пределах 5-15 км от места поиска.
Затем я использую объединение, чтобы объединить все результаты и показать на странице с разбиением на страницы. Под соответствующим заголовком "Точные результаты поиска" , "Результаты в пределах 5 км" и т. Д.
Теперь я хочу отсортировать результаты по id или add_date. Но когда я добавляю предложение order by в конце моего запроса (query1 union query 2 union query 3 order by add_date). Он сортирует все результаты. Но я хочу, чтобы он сортировался по каждому заголовку.
источник
Ответы:
Вы можете сделать это, добавив псевдостолбец с именем rank к каждому выбору, который вы можете сначала отсортировать, а затем отсортировать по другим критериям, например:
источник
a
и конец?order by
? ( «чтобы отсортировать или ограничить весьUNION
результат, заключите в скобки отдельныеSELECT
утверждения и поместите последнийORDER BY
илиLIMIT
после него» ). Сравните свой код с i.stack.imgur.com/LpTMU.pngДля этого можно использовать подзапросы:
источник
SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
ORDER BY
для отдельныхSELECT
операторов ничего неисточник
Запрос на объединение может иметь только одно главное
ORDER BY
предложение, IIRC. Чтобы получить это, в каждый запрос, составляющий более крупныйUNION
запрос, добавьте поле, которое будет единственным полем, по которому вы будете сортировать поUNION
элементамORDER BY
.Например, у вас может быть что-то вроде
Это
union_sort
поле может быть любым, по которому вы хотите сортировать. В этом примере просто получается поместить сначала результаты из первой таблицы, затем из второй таблицы и т. Д.источник
Не забывайте, что объединение всех - это способ добавлять записи в набор записей без сортировки или слияния (в отличие от объединения).
Так например:
Он делает отдельные запросы более понятными и позволяет выполнять сортировку по различным параметрам в каждом запросе. Однако, используя выбранный способ ответа, он может стать более ясным в зависимости от сложности и того, насколько связаны данные, потому что вы концептуализируете сортировку. Это также позволяет вам вернуть искусственный столбец в программу запросов, чтобы у него был контекст, по которому он мог сортировать или систематизировать.
Но этот способ имеет преимущество в том, что он быстрый, не вводит дополнительных переменных и упрощает разделение каждого запроса, включая сортировку. Возможность добавить лимит - это просто дополнительный бонус.
И, конечно, не стесняйтесь превращать объединение в объединение и добавлять сортировку для всего запроса. Или добавьте искусственный идентификатор, и в этом случае этот способ упрощает сортировку по различным параметрам в каждом запросе, но в остальном он совпадает с принятым ответом.
источник
Я получил это, работая над объединением плюс союз.
источник
Когда вы используете
ORDER BY
предложение внутри подзапроса, используемого вместе сUNION
mysql, оптимизируетORDER BY
предложение.Это связано с тем, что по умолчанию a
UNION
возвращает неупорядоченный список, поэтомуORDER BY
он ничего не сделает.Оптимизация упоминается в документации и говорит:
Последнее предложение немного вводит в заблуждение, потому что оно должно иметь эффект. Эта оптимизация вызывает проблему, когда вы находитесь в ситуации, когда вам нужно сделать заказ в подзапросе.
Чтобы заставить MySQL не выполнять эту оптимизацию, вы можете добавить предложение LIMIT, например:
Высокое
LIMIT
означает, что вы можете добавитьOFFSET
к общему запросу, если хотите сделать что-то вроде разбивки на страницы.Это также дает вам дополнительное преимущество - возможность использовать
ORDER BY
разные столбцы для каждого объединения.источник
Пытаться:
Где [QUERY 1] и [QUERY 2] - это два ваших запроса, которые вы хотите объединить.
источник
Это связано с тем, что вы сортируете весь набор результатов, вы должны сортировать каждую часть объединения отдельно или вы можете использовать предложение ORDER BY (что-то, например, расстояние подзапроса) THEN (что-то, например идентификатор строки)
источник
Я попытался добавить порядок по каждому из запросов до объединения, например
но, похоже, это не сработало. На самом деле он не выполнял упорядочение строк для каждого выбора.
Я думаю, вам нужно будет сохранить порядок снаружи и добавить столбцы в предложении where к порядку, что-то вроде
Это может быть немного сложно, поскольку вы хотите сгруппировать по диапазонам, но я думаю, что это должно быть выполнимо.
источник