我的查询的一部分如下:
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
有几行具有不同的日期值。我想选择日期>的ID组'2011-04-13 04:28:02'。然后,我想要属于某个组的平均行数,没有日期条件。
按原样查询,但顺便说一下。
我的另一个担忧是日期> '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
答案 0 :(得分:1)
HAVING与GROUP BY一起使用,因此它是派生表。我不知道如何使用索引。
答案 1 :(得分:1)
例如:
SELECT
column1,
count(column2) as count
FROM table
GROUP BY column1
HAVING count > 1
计数由您的查询计算。它没有在您的情况下编入索引。您可以将having子句更改为where子句。
答案 2 :(得分:-1)
该查询没有意义,因为“date”列在GROUP BY中,但既不是聚合也不是GROUP BY子句。
任何普通的SQL数据库都会拒绝它;如果在严格模式下,mysql会拒绝它。
在这种情况下,行为基本上是未定义的。不要这样做。
我很确定你想要WHERE过滤你的行,而不是HAVING。而且您不希望在列列表中指定日期,请尝试使用min(date)或max(date)。
不,HAVING不会使用索引,因为它需要执行GROUP BY来查找HAVING匹配的组。通常情况下,最好使用WHERE,并且只在聚合上使用HAVING(例如,HAVING COUNT(*)> 1)