在查询中多次使用查询结果

时间:2016-02-01 08:58:40

标签: mysql

假设我每个用户都有一张桌子,可以计算一年中一个月的SO声誉。

+-----+-------+------+
| rep | month | year |
+-----+-------+------+
| 10  | 12    | 2015 |
+-----+-------+------+
| 11  | 01    | 2016 |
+-----+-------+------+
| 12  | 02    | 2016 |
+-----+-------+------+

现在,要将数据显示到表格中,我希望该用户的起始年份,开始月份,结束年份和结束月份相应地缩放图表。

我的第一个想法是像这样的SQL请求:

SELECT MAX(YEAR) AS maxYear,
       MAX(MONTH) AS maxMonth,
       MIN(YEAR) AS minYear,
       MIN(MONTH) AS minMonth
FROM Balance

但这只有效,因为我在2015年开始;-)。在新的一年开始之后它显示了错误的结果:它标记了1月份的第一个月,因为查询没有看到一个月是否对应于正确的年份。

所以我创造了这个:

SELECT MAX(YEAR) AS maxYear,
       MAX(monthsOfMaxYear) AS maxMonth,
       MIN(YEAR) AS minYear,
       MIN(monthsOfMinYear) AS minMonth
FROM Balance,

  (SELECT MONTH AS monthsOfMaxYear
   FROM Balance
   WHERE YEAR =
       (SELECT MAX(YEAR)
        FROM Balance)) AS a,

  (SELECT MONTH AS monthsOfMinYear
   FROM Balance
   WHERE YEAR =
       (SELECT MIN(YEAR)
        FROM Balance)) AS b

但我对此并不满意,因为查询正在多次执行,例如SELECT MIN(YEAR) FROM Balance

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

答案很简单:你不能把它与一年分开看一个月。因此,将两者从年份开始合并,以便正确地获得排序顺序:例如12/2015 = 201512.这是:将年份乘以100并添加月份。要再次提取月份,请使用其模数100:

SELECT MAX(YEAR) AS maxYear,
       MAX(YEAR * 100 + MONTH) % 100 AS maxMonth,
       MIN(YEAR) AS minYear,
       MIN(YEAR * 100 + MONTH) % 100 AS minMonth
FROM Balance

答案 1 :(得分:0)

尝试以下查询 -

SELECT YEAR(MAX(CONCAT(`year`,'-',`month`,'-01'))) AS maxYear, MONTH(MAX(CONCAT(`year`,'-',`month`,'-01'))) AS maxMonth, 
       YEAR(MIN(CONCAT(`year`,'-',`month`,'-01'))) AS minYear, MONTH(MIN(CONCAT(`year`,'-',`month`,'-01'))) AS minMonth
       FROM balance;

如果通过以下查询将日期和月份数据存储在日期格式中,您可以做得更好 -

SELECT YEAR(MAX(mydate)) AS maxYear, MONTH(MAX(mydate)) AS maxMonth, 
       YEAR(MIN(mydate)) AS minYear, MONTH(MIN(mydate)) AS minMonth
       FROM balance;
相关问题