Использование предложения 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). Он сортирует все результаты. Но я хочу, чтобы он сортировался под каждым заголовком.

717   9  

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 ' s ORDER 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

    Ничего не найдено.