limit для нескольких условий

zewisa

Новичок
limit для нескольких условий

Есть таблица jobs - вакансии - с полями:
id, title, expired

Мне нужно сделать выборку из десяти строк, 2 из которых с expire < Now(), остальные - expire > Now()
При этом строки должны быть отсортированы по title.
То есть мне нужно сначала таблицу jobs отсортировать по title, а потом сделать так, чтобы на каждые 10 строк было не больше 2х с expire < Now()

Следующий запрос:

(SELECT 1 as type, id FROM jobs where expire < Now() limit 2)
UNION
(SELECT 2 as type, id FROM jobs where expire > Now())
ORDER BY title
limit X, 10

сначала выбирает 2 строки с expire < Now(), а только потом сортирует выборку. Подскажите как составить запрос, чтобы он сначала сортировал, а потом выбирал 10 строк, оставив в результате не больше 2х строк с expire < Now().

(Мне нужно, чтобы на каждой странице с текущими вакансиями, выводилось пару "занятых вакансий")

Это наверняка как-то не сложно делается, но что-то ничто не приходит в голову:)
 

damngood

Мозг был, но ушел...
Эмм, а если так?

(SELECT 1 as type, id FROM jobs where expire < Now() ORDER BY title limit 2)

UNION

(SELECT 2 as type, id FROM jobs where expire > Now() ORDER BY title limit X, 10)
 

zewisa

Новичок
Пробовала. Тогда оба селекта сортируют независимо, и на всех страницах будут одни и те же 2 строки с expire < Now().
То есть, скажем, на странице будут строки с title на "Я", и среди них 2 на "А"
 

damngood

Мозг был, но ушел...
Хм, у меня вариант работает, может я чего не так понял...
 

zewisa

Новичок
работает. но не правильно сортирует.
Я имею в виду:

Первая страница:

(SELECT 1 as type, id FROM jobs_data where expire < Now() ORDER BY title limit 2)

UNION

(SELECT 2 as type, id FROM jobs_data where expire > Now() ORDER BY title limit 0, 10)

Вывод:

type, id
1, 2
1, 5

2, 1
2, 3
...
2, 12

На 2 странице:

(SELECT 1 as type, id FROM jobs_data where expire < Now() ORDER BY title limit 2)

UNION

(SELECT 2 as type, id FROM jobs_data where expire > Now() ORDER BY title limit 11, 10)

Вывод:

type, id
1, 2
1, 5

2, 13
2, 15
...
2, 18

Первые 2 значения повторяются на всех страницах.

-~{}~ 05.11.09 17:22:

Может, это нельзя сделать запросом?
 

damngood

Мозг был, но ушел...
Не удивительно, у тебя в первом запросе всегда так будет, там тоже надо использовать limit X, 2 как мне кажется
 

tardis

lazy
только наверное не X, а, например, Y, изменяющийся с шагом 2,
а X тогда уж должен быть с шагом 8

-~{}~ 05.11.09 17:45:

т.е. на первой странице

(SELECT 1 as type, id FROM jobs_data where expire < Now() ORDER BY title limit 0,2)

UNION

(SELECT 2 as type, id FROM jobs_data where expire > Now() ORDER BY title limit 0, 8)

на второй

(SELECT 1 as type, id FROM jobs_data where expire < Now() ORDER BY title limit 2,2)

UNION

(SELECT 2 as type, id FROM jobs_data where expire > Now() ORDER BY title limit 8, 8)

и дальше втом же духе
 

damngood

Мозг был, но ушел...
Ну вы меня поняли. Уж сколько рядов выбирать там можно сообразить самому, [limit n, 8] или [limit n, 10] =)
 

zewisa

Новичок
Спасибо за ответы. Вот только правильной сортировки все-равно не получится. Мне нужно, чтобы вся выборка была отсортирована, а не каждый запрос по отдельности.

Вот следующий набор "title"- ов:

expired<NOW(): a1, a2, a3, .. a100, b13, b15

expired>NOW(): a1, b3 ... b100,

Так вот для такого набора данных на второй странице будут строки с титлами "b10" ... "b18", а также a3, a4 из первого селекта, вместо b13, b15.

Не уверена, что удалось обрисовать проблему

:)
 

tardis

lazy
так разве не годится?
PHP:
(SELECT 1 as type, id FROM jobs where expire < Now() ORDER BY title limit Y, 2) 
UNION  
(SELECT 2 as type, id FROM jobs where expire > Now() ORDER BY title limit X, 8)  
ORDER BY title
 

damngood

Мозг был, но ушел...
тебе в первой выборке нужны 2 последние записи?

(SELECT 1 as type, id FROM jobs where expire < Now() ORDER BY title DESC limit n,2)
UNION
(SELECT 2 as type, id FROM jobs where expire > Now() ORDER BY title limit n, 8)

Поправил, сори =)
 

zewisa

Новичок
tardis, так бы подошло, если бы сначала делался последний ORDER BY title (для всего запроса), а только потом бы отрабатывали limit-ы для подзапросов. А так, выбираются 2 на "а", 8 на "b" и только потом все это сортируется. b13, b15 в выборку не войдет. А должны
 

Alexandre

PHPПенсионер
нужна правильная сортировка
используй временую таблицу
 

tardis

lazy
не уверен, что до конца тебя понял, но еще наверное можно попробовать так:
сделать одну выборку на 8 свежих вакансий
получить в скрипте title первой вакансии в выборке
а затем выбрать 2 занятых вакансии, где title > выбранного title
потом в скрипте слить два массива и отсортировать
 

zewisa

Новичок
tardis, ты меня правильно понял :) Сделала так, как ты советуешь и все отлично работает, объединяет и сортирует. Ура

Спасибо всем большое!
 
Сверху