Сортировать сначала по последним 3 месяцам, затем по алфавиту - PullRequest
2 голосов
/ 22 декабря 2011

Меня попросили заказать товары на сайте, чтобы показать какие-либо товары за последние 3 месяца сначала (начиная с самых последних), а затем все остальные в алфавитном порядке.В настоящее время сайт написан в классах, и в настоящее время продукты упорядочены по дате добавления.Чтобы свести к минимуму рабочую нагрузку, мне было интересно, можно ли сделать это в одном SQL-запросе?Я думаю, что потребовалось бы 2 отдельных запроса, но я не являюсь экспертом в sql, поэтому мне было интересно, можно ли это сделать?

regards

Phil

РЕДАКТИРОВАТЬ

SELECT pr.id, pr.name AS prod_name, pr.eye_size, pr.bridge_size, pr.opt_size, pr.price, pr.range_id, pr.date_added, ra.name AS range_name
FROM oa_product AS pr, oa_brand AS br, oa_range AS ra
WHERE pr.status = 'Launched'
AND pr.brand_id = br.id
AND br.filename = 'karenmillen'
AND pr.status = 'Launched'
AND pr.range_id = ra.id
AND br.status = 'Active'
ORDER BY
CASE WHEN DATEDIFF( 'm', GETDATE(
), date_added ) <3
THEN date_added
ELSE NULL , prod_name
LIMIT 0 , 6

получение ошибки Версия сервера MySQL для правильного синтаксиса для использования рядом с 'date_added) <3 THEN date_added ELSE NULL, prod_name LIMIT 0, 6' в строке 11 </strong>

кто-нибудь знает почему?

Ответы [ 3 ]

3 голосов
/ 22 декабря 2011

Вы можете сделать это с помощью оператора CASE, чтобы рассматривать все даты продуктов старше 3 месяцев как равные.

Псевдокод (в чем-то, приближающемся к T-SQL)

SELECT ProductName, ProductDate
FROM   Products
ORDER BY 
  CASE WHEN DATEDIFF ('m', GETDATE(), ProductDate) < 3 THEN ProductDate 
       ELSE NULL,
  ProductName
1 голос
/ 22 декабря 2011

Использование синтаксиса MySQL:

select * from Products order by DateColumn > curdate() - interval 3 month desc, ProductName;
0 голосов
/ 22 декабря 2011

Вам не нужны два отдельных запроса для этого. Вы можете создать выражение, которое сначала сортирует последние продукты, а затем выражения, чтобы отсортировать их по-разному:

...
order by
  case when ProductDate < adddate(month, -3, getdate()) then 1 else 2 end,
  case when ProductDate < adddate(month, -3, getdate()) then ProductDate else null end desc,
  case when ProductDate < adddate(month, -3, getdate()) then null else ProductName end
...