Я хочу использовать order by с объединением в запросе mysql. Я выбираю различные типы записей на основе разных критериев из таблицы, основанной на расстоянии для поиска на моем сайте. Первый запрос на выборку возвращает данные, относящиеся к точному поиску места. Второй запрос на выборку возвращает данные о расстоянии в пределах 5 км от искомого места. Третий запрос на выборку возвращает данные, относящиеся к расстоянию в пределах 5-15 км от искомого места.
Затем я использую объединение, чтобы объединить все результаты и показать на странице с подкачкой. Под соответствующим заголовком, как «Точные результаты поиска» , «Результаты в течение 5 км» и т. Д.
Теперь я хочу отсортировать результаты на основе id или add_date. Но когда я добавляю порядок по предложению в конце моего запроса (запрос 1 объединение запрос 2 объединение запрос 3 порядок по add_date). Сортирует все результаты. Но то, что я хочу, это сортировать по каждому заголовку.
Вы можете сделать это, добавив псевдостолбец с именем 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 result.*
FROM (
[QUERY 1]
UNION
[QUERY 2]
) result
ORDER BY result.id
Где [QUERY 1] и [QUERY 2] - это два ваших запроса, которые вы хотите объединить.
Для этого можно использовать подзапросы:
select * from (select values1 from table1 order by orderby1) as a
union all
select * from (select values2 from table2 order by orderby2) as b
Это потому, что вы сортируете весь набор результатов, вам следует сортировать каждую часть объединения отдельно или вы можете использовать ORDER BY (что-то, например, расстояние подзапроса) THEN (что-то, например, строка id) пункт
Запрос на объединение может иметь только одно главное предложение ORDER BY
, IIRC. Чтобы получить это, в каждый запрос, составляющий больший запрос UNION
, добавьте поле, которое будет единственным полем, по которому выполняется сортировка для UNION
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
Это поле union_sort
может быть любым, по которому вы хотите сортировать. В этом примере просто случайно помещаются результаты из первой таблицы в первую, во вторую во вторую и т. Д.
Я попытался добавить порядок по каждому из запросов перед объединением, например
(select * from table where distance=0 order by add_date)
union
(select * from table where distance>0 and distance<=5 order by add_date)
, но, похоже, это не сработало. На самом деле он не выполнял упорядочение строк для каждого выбора.
Я думаю, вам нужно будет сохранить порядок по внешнему виду и добавить столбцы в предложении where к порядку по, что-то вроде
(select * from table where distance=0)
union
(select * from table where distance>0 and distance<=5)
order by distance, add_date
Это может быть немного сложно, так как вы хотите группировать по диапазонам, но Я думаю, это выполнимо.