MySQL ЗАКАЗ ПО ПОЛЕВАМ на месяцы - PullRequest
1 голос
/ 09 мая 2020

У меня есть таблица под названием months - она ​​содержит все 12 месяцев календаря, идентификаторы соответствуют номеру месяца.

Я буду запускать запрос, чтобы получить 2 или 3 последовательных месяца из этого таблица, например

  • апрель и май
  • июнь, июль, август
  • декабрь и январь

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

SELECT * FROM `months`

WHERE start_date BETWEEN <date1> AND <date2>

ORDER BY
    FIELD(id, 12, 1)

Это работает для декабря и января, но теперь, когда я пытаюсь получить январь и февраль, он выполняет их в неправильном порядке, то есть «Февраль - Январь» - I ' Я догадываюсь, потому что мы указали 1 в ORDER BY в качестве последнего значения.

Кто-нибудь знает правильный способ добиться этого? Как я уже упоминал, это также должно работать в течение 3 месяцев, поэтому, например, «ноябрь, декабрь, январь» и «декабрь, январь, февраль» следует извлекать все в таком порядке.

Ответы [ 3 ]

2 голосов
/ 09 мая 2020

Если вы хотите сначала декабрь, а остальные месяцы по порядку, тогда:

order by (id = 12) desc, id

MySQL обрабатывает логические значения как числа, с «1» для истины и «0» для ложного. desc ставит 12 на первое место.

EDIT:

Для обработки более общего случая вы можете использовать оконные функции. Если предположить, что числа идут подряд, тогда проблема усложняется. Это будет работать для интервалов в 2 и 3 месяца:

order by (case min(id) over () > 1 then id end),
         (case when id > 6 1 else 2 end),
         id

Я не хочу думать о более общем решении, основанном только на месяцах. В конце концов, вы можете просто использовать:

order by start_date

Или, если у вас есть запрос на агрегирование:

order by min(start_date)

, чтобы решить настоящую проблему.

1 голос
/ 09 мая 2020

Это неверно "mysql решение":

with cte (id, month) AS (
  select id, month from months 
  union all 
  select id, month from months
    ) 
, cte1 (id, month, r) as (select id, month, row_number() over() as r from cte ) 
select * from cte1 
  where id in (12, 1) 
           and r >= 12 order by r limit 2 ;

1 голос
/ 09 мая 2020
DECLARE 
 @monthfrom int = 12,
 @monthto int = 1;

with months as (select 1 m
    union all
    select m+1 from months where m<12)


 select m
 from months
 where m in (@monthfrom,@monthto)
 order by
    case when @monthfrom>@monthto
    then
        m%12
    else    
        m
    end

результат:

12
1

В основном в MySQL это можно сделать так же:

set @from =12;
set @to =1;
with recursive months(m) as (
  select 1 m 
  union all 
  select m+1 from months where m<12)   
select * 
from months 
where m in (@from,@to) 
order by case when @from>@to then m%12 else m end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...