У меня есть таблица как следующая

id name categoryid status isdelete start_date end_date showorder

SELECT * 
  FROM product 
 WHERE isdelete = 0 
   AND status = 1 
   AND name LIKE '%%' 
   AND categoryid = 4 
 ORDER 
    BY showorder ASC

Теперь я хочу привязать данные, например

1) Данные, которые start_date и end_date находятся между сегодняшней датой, должны быть наверху.

2) Остальные данные будут поступать с использованием порядка показа по полю.

Итак, как я могу добиться этого с помощью одного запроса, потому что позже мне придется реализовать разбиение на страницы, поэтому двойной запрос не подходит

0
Kashyap Patel 26 Июн 2017 в 15:10
Разве вы не можете использовать Union, чтобы написать два запроса и объединить результат в один?
 – 
Secespitus
26 Июн 2017 в 15:13

2 ответа

В ORDER BY может быть несколько ключей, включая выражение:

SELECT p.*
FROM product p
WHERE p.isdelete = '0' AND p.status = 1 AND
      p.name LIKE '%%' AND categoryid = '4'
ORDER BY (CASE WHEN getdate() BETWEEN start_date AND end_date THEN 1 ELSE 2 END),
         showorder ASC
2
Gordon Linoff 26 Июн 2017 в 15:12

Мы можем использовать более одного поля после ORDER BY AS:

SELECT * FROM product WHERE isdelete = '0' AND status = 1 AND name LIKE '%%' 
AND categoryid = '4' ORDER BY start_date DESC,end_date DESC,showorder ASC
0
user8193706 26 Июн 2017 в 15:17