2015-10-20 4 views
-1

Я создавал два столбца «на лету» в запросе mysql. Они должны выглядеть так.Создайте два столбца на лету в mysql

+------------------+ 
|Month | toOrder| 
+------------------- 
|Nov-2014 |2014-11 | 
-------------------- 
|Dec-2014 |2014-12 | 
-------------------- 
|Jan-2015 |2015-01 | 
-------------------- 
|Feb-2015 |2015-02 | 
-------------------- 
|Mar-2015 |2015-03 | 
-------------------- 
|Apr-2015 |2015-04 | 
-------------------- 
|May-2015 |2015-05 | 
-------------------- 
|Jun-2015 |2015-06 | 
-------------------- 
|Jul-2015 |2015-07 | 
-------------------- 
|Aug-2015 |2015-08 | 
-------------------- 
|Sep-2015 |2015-09 | 
-------------------- 
|Oct-2015 |2015-10 | 
+------------------+ 

Я использую этот запрос

SELECT * 
FROM (SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 11 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 10 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 9 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 8 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 7 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 6 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 5 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 4 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 3 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 2 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 1 MONTH), '%b-%Y') as Month UNION 
    SELECT DATE_FORMAT(now(), '%b-%Y') as Month) AS Months 
LEFT JOIN 
    (SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 11 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 10 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 9 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 8 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 7 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 6 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 5 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 4 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 3 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 2 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(DATE_SUB(now(), INTERVAL 1 MONTH), '%Y-%m') as toOrder UNION 
    SELECT DATE_FORMAT(now(), '%Y-%m') as toOrder) AS toOrders 
ON TRUE = TRUE 

Но вывод, который я получаю отличается от того, что я ожидал.

+------------------+ 
|Month | toOrder| 
+------------------- 
|Nov-2014 |2014-11 | 
-------------------- 
|Dec-2014 |2014-11 | 
-------------------- 
|Jan-2015 |2014-11 | 
-------------------- 
|Feb-2015 |2014-11 | 
-------------------- 
|Mar-2015 |2014-11 | 
-------------------- 
|Apr-2015 |2014-11 | 
-------------------- 
|May-2015 |2014-11 | 
-------------------- 
|Jun-2015 |2014-11 | 
-------------------- 
|Jul-2015 |2014-11 | 
-------------------- 
|Aug-2015 |2014-11 | 
-------------------- 
|Sep-2015 |2014-11 | 
-------------------- 
|Oct-2015 |2014-11 | 
-------------------- 
|Nov-2014 |2014-12 | 
-------------------- 
|Dec-2014 |2014-12 | 
-------------------- 
|Jan-2015 |2014-12 | 
-------------------- 
|Feb-2015 |2014-12 | 
-------------------- 
|Mar-2015 |2014-12 | 
-------------------- 
|Apr-2015 |2014-12 | 
-------------------- 
|May-2015 |2014-12 | 
-------------------- 
|Jun-2015 |2014-12 | 
-------------------- 
|Jul-2015 |2014-12 | 
-------------------- 
|Aug-2015 |2014-12 | 
-------------------- 
|Sep-2015 |2014-12 | 
-------------------- 
|Oct-2015 |2014-12 | 
-------------------- 
|Nov-2014 |2015-01 | 
+------------------+ 

Я использую «toOrders» колонку для того, чтобы сделать заказ, потом с другим LEFT JOIN, что у меня будет в будущем.

+0

Добро пожаловать в переполнение стека. Здесь важно задать вопрос. У вас есть два важных элемента: 1) Я хочу этого. 2) Я попробовал это. Но у вас нет 3), но он производит это вместо того, что я хочу. –

+0

@ Олли благодарю вас за ваш комментарий, я добавлю третий элемент на мой вопрос, чтобы задать полный вопрос. –

ответ

0

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

SELECT DATE_FORMAT(Month,'%b-%Y') AS Month, 
     DATE_FORMAT(Month,'%Y-%m') AS toOrder 
FROM (
    SELECT DATE_SUB(now(), INTERVAL 11 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 10 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 9 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 8 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 7 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 6 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 5 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 4 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 3 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 2 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 1 MONTH) as Month  UNION ALL 
    SELECT DATE_SUB(now(), INTERVAL 0 MONTH) as Month 
) months 
ORDER BY months.Month 

Однако эта формулировка может привести к странным результатам вблизи концов месяцев. Я бы полностью доверял следующему запросу.

SELECT DATE_FORMAT(month.start - INTERVAL seq.seq MONTH,'%b-%Y') AS Month, 
     DATE_FORMAT(month.start - INTERVAL seq.seq MONTH,'%Y-%m') AS toOrder 
FROM (
    SELECT 11 AS seq UNION ALL 
    SELECT 10 UNION ALL 
    SELECT 9 UNION ALL 
    SELECT 8 UNION ALL 
    SELECT 7 UNION ALL 
    SELECT 6 UNION ALL 
    SELECT 5 UNION ALL 
    SELECT 4 UNION ALL 
    SELECT 3 UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 0 
) seq 
JOIN (
    SELECT CURRENT_DATE() - INTERVAL DAYOFMONTH(CURRENT_DATE()) - 1 DAY AS start 
) month 
ORDER BY seq.seq DESC 

Это потому, что

SELECT CURRENT_DATE() - INTERVAL DAYOFMONTH(CURRENT_DATE()) - 1 DAY AS start 

делает хорошую работу преобразования сегодняшней даты в первый день текущего месяца.

+0

спасибо Олли за ваш ответ. Первое решение я бы изменил заказ на ORDER BY toOrder, а затем получил порядок, который мне нужен. Второе решение дает мне точный результат, который мне нужен. –

+0

Кроме того, со вторым решением вы говорите мне, что запрос будет проходить с сегодняшнего дня до 12 месяцев назад. Правильно? –

+0

Вы нашли ошибку в своем первом решении, спасибо. Я бы использовал 'ORDER BY months.Month'. Я отредактировал свой ответ. Второй запрос выдает список из двенадцати месяцев * окончания * с текущим месяцем. –

Смежные вопросы