【问题标题】:MySql AVG() and WHEREMySql AVG() 和 WHERE
【发布时间】:2015-01-27 03:12:10
【问题描述】:

我正在为如何编写此查询而苦苦挣扎,但找不到可以帮助我解决问题的答案。

考虑下表:

-----------------------------------------------
| ID | Value1  | Value2 | Value3 | Date       |
-----------------------------------------------
| 1  | 10      | 23     | 30     | 2015-01-01 |
-----------------------------------------------
| 1  | 11      | 33     | 40     | 2015-02-01 |
-----------------------------------------------
| 2  | 26      | 93     | 20     | 2015-01-01 |
-----------------------------------------------
| 2  | 11      | 33     | 50     | 2015-02-01 |
-----------------------------------------------

我想检索 Date 为 2015-01-01 的 Value1 的平均值

我以为

SELECT AVG(PAM_1) FROM MyTable WHERE DATE = 2015-01-01

可以,但当然不行。我知道我可能需要使用 HAVING,但我很困惑是否还必须使用 GROUP BY 以及是否需要 AS(某物)部分。

编辑

问题与查询无关。我通过这样的变量提供日期:

$sth = $db->prepare("SELECT AVG(Value1) FROM MyTable WHERE DATE = $date");

这对于准备好的语句是不可能的。

【问题讨论】:

  • "但它当然不会" --- 为什么不应该这样做并不明显
  • 你在做算术:2015 - 1 - 1 = 2013,它转换为空日期值
  • 为此使用单引号和双引号。例如“SELECT AVG(PAM_1) FROM MyTable WHERE DATE = '”。 $日期。 "'"
  • 这不是因为我使用的是准备好的语句,而是直接插入了保存日期的变量。

标签: php mysql where average


【解决方案1】:

您的查询基本没问题。你的日期常数不是。日期常量应该用单引号括起来:

SELECT AVG(PAM_1)
FROM MyTable
WHERE DATE = '2015-01-01';

如果日期可能包含时间部分,那么以下是处理此问题的最佳方法:

SELECT AVG(PAM_1)
FROM MyTable
WHERE DATE >= '2015-01-01' AND DATE < '2015-01-02';

【讨论】:

  • 第二点我更喜欢WHERE DATE = DATE('2015-01-01'),但也许效率不高?
  • 呃...实际上在我的约会中,我在声明中使用了一个变量。准备好的声明。所以我当然是傻了。该变量必须在execute() 中声明。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多