Использование объединения и порядка по выражению в mysql

Я хочу использовать order by с объединением в запросе mysql. Я выбираю различные типы записей на основе разных критериев из таблицы, основанной на расстоянии для поиска на моем сайте. Первый запрос на выборку возвращает данные, относящиеся к точному поиску места. Второй запрос на выборку возвращает данные о расстоянии в пределах 5 км от искомого места. Третий запрос на выборку возвращает данные, относящиеся к расстоянию в пределах 5-15 км от искомого места.

Затем я использую объединение, чтобы объединить все результаты и показать на странице с подкачкой. Под соответствующим заголовком, как «Точные результаты поиска» , «Результаты в течение 5 км» и т. Д.

Теперь я хочу отсортировать результаты на основе id или add_date. Но когда я добавляю порядок по предложению в конце моего запроса (запрос 1 объединение запрос 2 объединение запрос 3 порядок по add_date). Сортирует все результаты. Но то, что я хочу, это сортировать по каждому заголовку.

118
задан hims056 24 July 2013 в 09:51
поделиться

6 ответов

Вы можете сделать это, добавив псевдостолбец с именем 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
211
ответ дан 24 November 2019 в 01:55
поделиться

Попробуйте:

SELECT result.* 
FROM (
 [QUERY 1]
 UNION
 [QUERY 2]
) result
ORDER BY result.id

Где [QUERY 1] и [QUERY 2] - это два ваших запроса, которые вы хотите объединить.

0
ответ дан 24 November 2019 в 01:55
поделиться

Для этого можно использовать подзапросы:

select * from (select values1 from table1 order by orderby1) as a
union all
select * from (select values2 from table2 order by orderby2) as b
41
ответ дан 24 November 2019 в 01:55
поделиться

Это потому, что вы сортируете весь набор результатов, вам следует сортировать каждую часть объединения отдельно или вы можете использовать ORDER BY (что-то, например, расстояние подзапроса) THEN (что-то, например, строка id) пункт

0
ответ дан 24 November 2019 в 01:55
поделиться

Запрос на объединение может иметь только одно главное предложение 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 может быть любым, по которому вы хотите сортировать. В этом примере просто случайно помещаются результаты из первой таблицы в первую, во вторую во вторую и т. Д.

8
ответ дан 24 November 2019 в 01:55
поделиться

Я попытался добавить порядок по каждому из запросов перед объединением, например

(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

Это может быть немного сложно, так как вы хотите группировать по диапазонам, но Я думаю, это выполнимо.

0
ответ дан 24 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: