Использование предложения union и order by в mysql
Я хочу использовать order BY с union в запросе mysql.
Я выбираю разные типы записей на основе разных критериев из таблицы на основе расстояния для поиска на моем сайте.
Первый запрос select возвращает данные, связанные с точным поиском места .
Второй запрос select возвращает данные, связанные с расстоянием в пределах 5 км от искомого места.
3-й запрос select возвращает данные, связанные с расстоянием в пределах 5-15 км от места поиска.
затем я использую union для объединения всех результаты и показать на странице с подкачки. Под соответствующим заголовком Как 'точные результаты поиска', 'результаты в пределах 5 км' etc
теперь я хочу сортировать результаты на основе id или add_date. Но когда я добавляю предложение order by в конце моего запроса (query1 union query 2 union query 3 order BY add_date). Он сортирует все результаты. Но я хочу, чтобы он сортировался под каждым заголовком.
9 ответов:
вы можете сделать это, добавив псевдо-столбец с именем rank к каждому выбору, который вы можете сортировать сначала, перед сортировкой по другим критериям, например:
select * from ( select 1 as Rank, id, add_date from Table union all select 2 as Rank, id, add_date from Table where distance < 5 union all select 3 as Rank, id, add_date from Table where distance between 5 and 15 ) a order by rank, id, add_date desc
вы можете использовать подзапросы для этого:
select * from (select values1 from table1 order by orderby1) as a union all select * from (select values2 from table2 order by orderby2) as b
(select add_date,col2 from table_name) union (select add_date,col2 from table_name) union (select add_date,col2 from table_name) order by add_date
Не забывайте, что union all-это способ добавления записей в набор записей без сортировки или слияния (в отличие от union).
например:
select * from ( select col1, col2 from table a <....> order by col3 limit by 200 ) a union all select * from ( select cola, colb from table b <....> order by colb limit by 300 ) bон сохраняет отдельные запросы яснее и позволяет сортировать по различным параметрам в каждом запросе. Однако с помощью способа выбранного ответа это может стать яснее, в зависимости от сложности и как связанные данные, потому что вы концептуализации подобного. Это также позволяет вернуть искусственный столбец к программе запроса, чтобы он имел контекст, по которому он может сортировать или организовывать.
но этот способ имеет то преимущество, что он быстрый, не вводит дополнительных переменных и позволяет легко отделить каждый запрос, включая сортировку. Возможность добавить лимит-это просто дополнительный бонус.
и, конечно же, не стесняйтесь превращать все объединение в объединение и добавлять сортировку для всего запроса. Или добавьте искусственный идентификатор, и в этом случае этот способ упрощает сортировку по разным параметры в каждом запросе, но в остальном это то же самое, что и принятый ответ.
запрос объединения может иметь только один мастер
ORDER BYстатья, если не ошибаюсь. Чтобы получить это, в каждом запросе составляя большеUNIONзапрос, добавьте поле, которое будет одно поле, которое вы сортируете дляUNION' sORDER BY.например, у вас может быть что-то вроде
SELECT field1, field2, '1' AS union_sort UNION SELECT field1, field2, '2' AS union_sort UNION SELECT field1, field2, '3' AS union_sort ORDER BY union_sortэто
Я получил это работает на join plus union.
(SELECT table1.column1, table1.column2, foo1.column4 FROM table1, table2, foo1, table5 WHERE table5.somerecord = table1.column1 ORDER BY table1.column1 ASC, table1.column2 DESC ) UNION (SELECT ... Another complex query as above ) ORDER BY column1 DESC, column2 ASC
попробуй:
SELECT result.* FROM ( [QUERY 1] UNION [QUERY 2] ) result ORDER BY result.idгде [запрос 1] и [запрос 2] - это ваши два запроса, которые вы хотите объединить.
Это потому, что вы сортируете весь результирующий набор, Вы должны сортировать каждую часть объединения отдельно, или вы можете использовать ORDER BY (что-то т. е. расстояние подзапроса) тогда (что-то т. е. идентификатор строки) предложение
Я попытался добавить заказ по каждому из запросов до объединения, как
(select * from table where distance=0 order by add_date) union (select * from table where distance>0 and distance<=5 order by add_date)но это, похоже, не сработало. На самом деле он не делал заказ внутри строк из каждого выбора.
Я думаю, вам нужно будет сохранить order by снаружи и добавить столбцы в предложении where в order by, что-то вроде
(select * from table where distance=0) union (select * from table where distance>0 and distance<=5) order by distance, add_dateЭто может быть немного сложно, так как вы хотите сгруппировать по диапазонам, но я думаю, что это должно быть выполнимо.
Comments