MySQL 从一张表查询 - 选择相同的字段两次

Posted

技术标签:

【中文标题】MySQL 从一张表查询 - 选择相同的字段两次【英文标题】:MySQL Query from one table - Select same field twice 【发布时间】:2016-08-26 14:17:55 【问题描述】:

首先,我是 mysql 的新手,如果我要问一些已经在不同“术语”下得到回答的问题,我深表歉意。一个多星期以来,我一直在寻找解决方案,但我无法想出一个,可能是因为我没有使用正确的关键字。在这个意义上,请容忍我和我的无知:)

我有一个包含以下字段的表格:

ID            int(11)        NO     PRI     auto_increment
Building      int(11)        YES    MUL     
CounterNo     int(11)        YES    MUL     
ReadingDate   datetime       YES            
StartMeter    int(11)        YES            
EndMeter      int(11)        YES            
CostKw        decimal(10,6)  YES            
Multiplier    smallint(3)    YES

我想进行查询,我将使用它来填充比较折线图,它将返回以下内容:

Building | Cons1 | Cons2   | Month
1          1year   ybefore   Month

然后将使用月份名称填充 X 轴,Cons1 将是每个建筑物在去年每个月的消耗量,而 Cons2 将是每个建筑物在前一年每个月的消耗量.

我已经在玩了,到目前为止我已经到了以下一个:

SELECT  Building,
                        CASE 
            WHEN ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
            THEN (EndMeter - StartMeter)
            ELSE NULL
        END
    AS 'Cons1',
            CASE 
            WHEN ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 Year) AND DATE_SUB(NOW(), INTERVAL 1 Year) 
            THEN (EndMeter - StartMeter)
            ELSE NULL
        END
    AS 'Cons2',
CONCAT(
        MONTHNAME (
            tblElectricReadings.ReadingDate
        )
    ) AS MonthRecorded
FROM    tblElectricReadings
WHERE   ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR)
ORDER BY ReadingDate

这会产生我想要的结果,但它不会“合并”(再次,抱歉,如果我在这里使用了错误的词)将 Cons1 和 Cons2 放在一起,而是将空值放入任一字段,从而创建双我需要的记录。基本上,查询工作正常,但这不是我想要的结果。我希望 Cons1 和 Cons2 都根据每个月填充相关消费,以便我可以相应地填充折线图(2 条线,1 条用于 Cons1,另一条用于 Cons2)。

我希望我已经足够清楚了,如果没有,请原谅我,如果您需要更多信息,请告诉我。

提前感谢您提供的任何帮助。

编辑:回答 Paul - 每个建筑物每个月只有 1 个条目,所以这不是问题。但感谢您注意到这一点!还要感谢 xQbert 的一百万 - 你的答案正是我想要的 :) 谢谢你的时间。

【问题讨论】:

使用 max 和 group by。类似于:***.com/questions/3263126/… 如果一个月内有多篇文章,你想拿哪一篇? 【参考方案1】:

由于我们知道每条记录都会有一个空值,因此使用最大值(或最小值)消除空记录值并将结果合并到一行/记录中。

SELECT  Building,
        max(CASE 
            WHEN ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
            THEN (EndMeter - StartMeter)
            ELSE NULL
        END)
    AS 'Cons1',
        max(CASE 
            WHEN ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 Year) AND DATE_SUB(NOW(), INTERVAL 1 Year) 
            THEN (EndMeter - StartMeter)
            ELSE NULL
        END)
    AS 'Cons2',
CONCAT(
        MONTHNAME (
            tblElectricReadings.ReadingDate
        )
    ) AS MonthRecorded
FROM    tblElectricReadings
WHERE   ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR)
GROUP BY Building, CONCAT(MONTHNAME(tblElectricReadings.ReadingDate))
ORDER BY ReadingDate

【讨论】:

以上是关于MySQL 从一张表查询 - 选择相同的字段两次的主要内容,如果未能解决你的问题,请参考以下文章

怎么从一张表中查询数据插入到另一张表中

mysql同一张表中两个字段 关联另一张表的相同字段 查询出两个值

sql语句 怎么从一张表中查询数据插入到另一张表中

MySQL:仅当不在另一张表中时才从一张表中选择电子邮件?

Oracle中的多行插入查询(从一张表中选择多行并插入到另一张表中[重复]

sql存储过程从一张表中查询到的值作为另一张表的新的字段