【问题标题】:Create two columns on the fly in mysql在mysql中动态创建两列
【发布时间】:2015-10-20 04:21:47
【问题描述】:

我在 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 执行 ORDER BY。

【问题讨论】:

  • 欢迎堆栈溢出。在这里实际提出问题很重要。你有两个重要的元素:1)我想要这个。 2)我试过这个。但是你没有 3) 但它产生的不是我想要的。
  • @Ollie 感谢您的评论,我将在我的问题中添加第三个元素以获得完整的问题。

标签: mysql datetime sequence


【解决方案1】:

您正在执行没有 ON 子句的 JOIN。这称为交叉连接,并生成所有可能的输出组合。像这样的东西可能会产生你想要的东西。

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

很好地将今天的日期转换为当月的第一天。

【讨论】:

  • 感谢奥利的回答。第一个解决方案我会将订单更改为 ORDER BY toOrder 然后我得到我需要的订单。第二种解决方案为我提供了我需要的确切输出。
  • 另外,使用第二种解决方案,您告诉我查询将从今天开始到 12 个月前。对吗?
  • 您在我的第一个解决方案中发现了一个错误,谢谢。我会使用 ORDER BY months.Month 。我已经编辑了我的答案。第二个查询列出了以当前月份结束的十二个月的列表。
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2014-02-10
  • 2018-12-04
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
相关资源
最近更新 更多