在 mysql 中动态创建两列
Create two columns on the fly in 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 执行 ORDER BY。
您正在执行没有 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
可以很好地将今天的日期转换为本月的第一天。
我在 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。
您正在执行没有 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
可以很好地将今天的日期转换为本月的第一天。