2010-07-02 4 views
3

Я создаю функцию поиска для сайта, посвященного заданию. Для этого мне нужно сначала показать списки с соответствующими заголовками, а затем списки вакансий с соответствующим описанием. Вот запрос, я использую прямо сейчас:Сортировка запросов объединения в MySQL

Пример:

(SELECT * FROM `jobs` WHERE title LIKE '%java%developer%') 
UNION DISTINCT 
(SELECT * FROM `jobs` WHERE description LIKE '%java%developer%') 

Однако, мне также нужно сортировать результаты по отметке времени, с тем, чтобы показать последние результаты первого. Например, он должен давать результаты с соответствующими заголовками, отсортированными по timestamp, а затем списками с соответствующим описанием, отсортированным по метке времени.

+1

Вы говорите * все * совпадения в заголовках должны предшествовать * все * совпадение описания? Потому что последние совпадения описания, вероятно, более ценны, чем старые совпадения заголовков. – egrunin

ответ

4

я бы, вероятно, написать запрос, подобный:

select *, ((title like '%…%')*2 + (description like '%…%')) as rank 
    from jobs 
    where title like '%…%' 
     or description like '%…%' 
order by rank desc, time desc 

Таким образом, строки, в которых как название и описание сначала появится совпадение, затем будут указаны совпадения, затем описание - совпадение. я не тестировал его, но обычно mysql делает хорошую работу, конвертируя bool в int (true: 1, false: 0)

+0

это работает, спасибо большое! – Chetan

3

Попробуйте заменить timestamp именем вашей временной метки столбца

(SELECT *, 1 as unionsorting FROM `jobs` WHERE title LIKE '%java%developer%' ORDER BY timestamp desc) 
UNION DISTINCT 
(SELECT *, 2 as unionsorting FROM `jobs` WHERE description LIKE '%java%developer%' ORDER BY timestamp desc) 
ORDER BY unionsorting 

Но делать 2 запросов, вероятно, быстрее (это должно быть проверено)

SELECT * FROM `jobs` WHERE title LIKE '%java%developer%' ORDER BY timestamp desc 
SELECT * FROM `jobs` WHERE description LIKE '%java%developer%' ORDER BY timestamp desc 
+0

woulnd't сортировка столбцов временной метки будет иметь приоритет над заголовком> описание сортировки? – potatopeelings

+0

@potatopeelings Да, я неправильно понял вопрос и обновил свой ответ! Спасибо, что указали это – radius

+0

Это работает хорошо, но вам нужно изменить '1 как unionorting, *' на '*, 1 как unionorting'. – Mike

1

Отредактировано: исправить ...

Это немного неуклюжий, но некоторые вариации на нем будут работать:

SELECT title, description, timestamp_column, min(rank) from 
(
    (SELECT *, 1 as rank FROM `jobs` WHERE title LIKE '%java%developer%') 
    UNION 
    (SELECT *, 2 as rank FROM `jobs` WHERE description LIKE '%java%developer%') 
) x 
GROUP BY title, description, timestamp_column 
ORDER BY min(rank), timestamp_column DESC 

Это используется предложение GROUP BY вместо DISTINCT

+0

сортировка столбца timestamp имела бы приоритет над названием> описание сортировки, правильно? – potatopeelings

+0

@potatopeelings: Исправлено, я думаю. – egrunin

+0

Это даст некоторые избыточные результаты, так как списки, имеющие ключевые слова как в заголовке, так и в описании, будут возвращены дважды. Добавление 1 или 2 сделает отчетливым неактуальным. – Chetan

0
(SELECT * FROM `jobs` A WHERE title LIKE '%java%developer%' ORDER BY A.colDateTime desc) 
UNION DISTINCT 
(SELECT * FROM `jobs` B WHERE description LIKE '%java%developer%' ORDER BY B.colDateTime desc) 
+0

um ... было бы это последовательным? http://dev.mysql.com/doc/refman/5.0/en/union.html> ... Однако использование ORDER BY для отдельных операторов SELECT не подразумевает ничего о порядке, в котором строки отображаются в конечном результате, потому что UNION по умолчанию создает неупорядоченный набор строк. – potatopeelings

+0

О, это правильно? Может кто-то, пожалуйста, подтвердите это? – VoodooChild

+0

Да, это правда. См. [Синтаксис UNION] (http://dev.mysql.com/doc/refman/5.0/en/union.html). Ищите «использование ORDER BY для отдельных операторов SELECT не означает ничего о порядке». – Mike

1
SELECT * 
FROM `jobs` 
WHERE (title LIKE '%java%developer%' OR description LIKE '%java%developer%') 
ORDER BY (CASE WHEN title LIKE '%java%developer%' THEN 0 ELSE 1 END), timestamp_col DESC 
+0

не является END, требуемым для CASE? – potatopeelings

+0

да ты прав, я пропустил это, спасибо – andrem

Смежные вопросы