4

我的查询的一部分如下所示:

HAVING date > '2011-04-13 04:28:03'

日期变量被索引,这对查询有影响吗?

EXPLAIN EXTENDED 似乎没有使用索引,但我不知道这是否仅仅是因为我正在测试的数据库中有 4 行。

我的查询:

SELECT AVG(slen) FROM
(
SELECT date, COUNT(id) as slen
FROM table
WHERE product_id = 2830
GROUP BY id
HAVING date > '2011-04-13 04:28:02'
) as T

有几行具有不同的日期值。我想选择日期 > '2011-04-13 04:28:02' 的 ID 组。然后我想要属于一个组的平均行数,没有日期条件

顺便说一句,查询现在还不起作用。

我的另一个担忧是 date > '2011-04-13 04:28:02' 是否会使用我的日期列索引。

从这个数据集中:

sid             datelast                product_id
782240551706    2011-04-13 00:51:52     2830
782240551706    2011-04-13 04:05:48     2830
782240551706    2011-04-13 04:28:03     2830
111111111111    2011-04-13 00:50:30     2830

期望的结果:

应选择 id 为 782240551706 的组,平均值应为 3。

以下查询产生所需的结果:

SELECT AVG(slen) FROM
(
SELECT date, COUNT(id) as slen
FROM table
WHERE product_id = 2830
GROUP BY id
HAVING **max(date)** > '2011-04-13 04:28:02'
) as T
4

3 回答 3

1

HAVING 与 GROUP BY 结合使用,因此它是一个派生表。我不知道如何使用索引。

于 2011-04-14T02:29:23.237 回答
1

例如:

SELECT 
    column1, 
    count(column2) as count 
FROM table 
GROUP BY column1 
HAVING count > 1

计数由您的查询计算得出。在你的情况下它没有被索引。您可以将 having 子句更改为 where 子句。

于 2011-04-14T03:10:48.027 回答
-1

该查询没有意义,因为“日期”列在 GROUP BY 中,但既不是聚合子句也不是 GROUP BY 子句。

任何普通的 SQL 数据库都会拒绝它;如果在严格模式下,mysql 会拒绝它。

在这种情况下,行为基本上是未定义的。不要这样做。

我很确定您希望 WHERE 过滤您的行,而不是 HAVING。并且您不想在列列表中指定日期,请尝试使用 min(date) 或 max(date) 代替。

不,HAVING 不会使用索引,因为它需要执行 GROUP BY 来查找 HAVING 匹配的组。通常最好使用 WHERE,并且您只能在聚合上使用 HAVING(例如 HAVING COUNT(*) > 1)

于 2011-04-14T05:56:39.147 回答