mysql - 从子查询中选择多个字段

标签 mysql sql

我有下一个查询:

SELECT
    a.Date,
    (SELECT SUM(Used), SUM(Max) FROM Switch_Statistic b WHERE Date = (SELECT MAX(Date) FROM Switch_Statistic WHERE Switch_ID = b.Switch_ID AND Date <= a.Date))
FROM Switch_Statistic a
GROUP BY Date;

如您所见,我需要从子查询中选择SUM(Used), SUM(Max)。使用 CONCAT 并不是一个好的解决方案!


表架构:

ID --- Switch_ID --- Date --- Max --- Used

一些数据:

1   641 2014-10-04  2   16
20  630 2014-10-04  1   7
24  634 2014-10-04  0   8
26  641 2014-10-06  2   16
32  641 2014-10-07  2   16
35  641 2014-10-08  3   16
39  641 2014-10-09  2   16
64  293 2014-10-10  1   22
...
557 38  2014-10-12  3   22
559 293 2014-10-12  1   22
563 294 2014-10-12  6   22
565 641 2014-10-12  2   16

我需要什么: CONCAT_WS 示例

mysql> SELECT
    a.Date,
    (SELECT CONCAT_WS('/', SUM(Used), SUM(Max)) FROM Switch_Statistic b WHERE Date = (SELECT MAX(Date) FROM Switch_Statistic WHERE Switch_ID = b.Switch_ID AND Date <= a.Date)) AS Result
FROM Switch_Statistic a
GROUP BY Date;
+------------+----------+
| Date       | Result   |
+------------+----------+
| 2014-10-04 | 3/31     |
| 2014-10-06 | 3/31     |
| 2014-10-07 | 3/31     |
| 2014-10-08 | 4/31     |
| 2014-10-09 | 3/31     |
| 2014-10-10 | 249/1587 |
| 2014-10-11 | 354/2147 |
| 2014-10-12 | 360/2185 |
+------------+----------+
8 rows in set (0.26 sec)

查询逻辑: 1)从表中选择所有日期 2) SUM - 当前日期的已使用和最大值,如果 Switch_ID 没有该日期的记录,则选择表中存在的最后一个

链接到sqlfiddle - http://sqlfiddle.com/#!2/c3d479

最佳答案

您应该能够仅通过聚合而不使用子查询或联接来完成此操作:

  SELECT date, sum(used) as used, sum(max) as max
  FROM switch_statistic ss
  where ss.date = (select max(date) from Switch_Statistics ss2 where ss2.Switch_id = ss.SwitchId
  GROUP BY ss.date;

编辑:

您似乎想要一个累计金额。在 MySQL 中,这通常最好使用变量来完成:

SELECT date, used, max, (@u := @u + used) as cumeused, @m := @m + max) as cumemax
fROM (SELECT date, sum(used) as used, sum(max) as max
      FROM switch_statistic ss
      GROUP BY ss.date
     ) ss CROSS JOIN
     (SELECT @u := 0, @m := 0) vars
ORDER BY date;

关于mysql - 从子查询中选择多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327858/

相关文章:

mysql - Ruby on Rails - MySQL 错误的字符串值

mysql - 删除表1中列中某些值的一部分,发现表2状态为非事件状态

MySQL查询以查找表中不在列表中的ID

mysql - 如何使用 Dropbox 在两台计算机上保持 mysql 数据库同步?

php - 拒绝用户 '' @'localhost' 访问数据库 'finalproject'

mysql - 使用 InnoDB 引擎比较 MySQL 中大 'text' 类型值的最有效方法

sql - 可扩展的 CRUD 应用程序。储存技术

php - 如何通过连接列在 MYSQL 中通过与另一个表的关系来过滤表?

php - 我怎样才能得到当前日期?

sql - 删除特定值的列