Mysql Сортировка WHERE при использовании BETWEEN

Alien2001

Новичок
Добрый день! Стоит задача выбрать строки из базы по определенным id (на самом деле это база фотографий). На входе задаются эти самые номера по следующему шаблону:

(335-387, 702-709, 288, 440-442)

Из этой строки получается следующий запрос

Код:
SELECT * from table WHERE pid BETWEEN 335 AND 387 OR pid BETWEEN 702 AND 709 OR pid BETWEEN 288 AND 288 OR pid BETWEEN 440 AND 442
Вопрос, как сделать, чтобы полученные строки были отсортированы в том порядке, в котором они прописаны в WHERE - чтобы сначала 33-387, потом 702-709 и т.д?
 

Kotofey

FloodMaster.
Добрый день! Стоит задача выбрать строки из базы по определенным id (на самом деле это база фотографий). На входе задаются эти самые номера по следующему шаблону:

(335-387, 702-709, 288, 440-442)

Из этой строки получается следующий запрос

Код:
SELECT * from table WHERE pid BETWEEN 335 AND 387 OR pid BETWEEN 702 AND 709 OR pid BETWEEN 288 AND 288 OR pid BETWEEN 440 AND 442
Вопрос, как сделать, чтобы полученные строки были отсортированы в том порядке, в котором они прописаны в WHERE - чтобы сначала 33-387, потом 702-709 и т.д?
ORDER BY pid ASC не?
 

Alien2001

Новичок
Не, так нельзя, сортировка не по pid, а по порядку в запросе, в моем примере сначала 702-709, а потом уже 440-442

Получается, что в таком случае все равно придется "распотрошить" строку на четкий порядок 335,336,337, 338, ....702, 703, 704, 705, ,,,208, 440, 441, 442 ? А проще никак?
 

Alien2001

Новичок
Спасибо большое!

Получилась такая конструкция
Код:
SELECT *  FROM table  WHERE pid BETWEEN 335 AND 387 OR pid BETWEEN 702 AND 709 OR pid BETWEEN 288 AND 288 ORDER BY pid BETWEEN 335 AND 387 DESC, pid BETWEEN 702 AND 709 DESC, pid BETWEEN 288 AND 288 DESC
 

Alien2001

Новичок
И все ж таки, полученная конструкция работает неправильно, очевидно, BETWEEN не работает в ORDER BY. Пришлось перебрать все возможные номера, использовать в WHERE IN , а в ORDER BY - FIELD (или еще можно, видимо FIND_IN_SET, я не понял четко, чем они отличаются для данной задачи и что лучше использовать)

Код:
SELECT * FROM table WHERE pid IN (845,846,847,848,849,850,830,831,832,833,834,835,840) ORDER BY FIELD (pid,845,846,847,848,849,850,830,831,832,833,834,835,840)
 

DiMA

php.spb.ru
Команда форума
Код:
SELECT *,
    IF(pid BETWEEN 335 AND 387,1,0) x1,
    IF(pid BETWEEN 702 AND 709,2,0) x2,
    IF( pid BETWEEN 288 AND 288,3,0) x3,
    ....
from table WHERE pid BETWEEN 335 AND 387 OR pid BETWEEN 702 AND 709 OR pid BETWEEN 288 AND 288 OR pid BETWEEN 440 AND 442
ORDER BY x1,x2,x3... , pid
или

Код:
SELECT *,
    IF(pid BETWEEN 335 AND 387,1,  IF(pid BETWEEN 702 AND 709,2,  IF(pid BETWEEN 288 AND 288,3, ......) ) ) sort
    ....
from table WHERE pid BETWEEN 335 AND 387 OR pid BETWEEN 702 AND 709 OR pid BETWEEN 288 AND 288 OR pid BETWEEN 440 AND 442
ORDER BY sort, pid
 

Alien2001

Новичок
Спасибо, попробую.
Для написания таких конструкций у меня знаний не хватило :eek:
 
Сверху