Mysql 带有where子句和having的Max查询
上面的查询没有给出结果。但2013-12-08年对象SYZIN9WA有24个值。此查询应给出所有字段的结果,其中Mysql 带有where子句和having的Max查询,mysql,having,Mysql,Having,上面的查询没有给出结果。但2013-12-08年对象SYZIN9WA有24个值。此查询应给出所有字段的结果,其中VS.HSDPA.MeanChThroughput.TotalBytes(byte)为最大值。您应使用Group BY和CLUSE: SELECT * FROM `3g_t2_24hour_data` WHERE `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA' HAVING `vs.hs
VS.HSDPA.MeanChThroughput.TotalBytes(byte)
为最大值。您应使用Group BY和CLUSE:
SELECT *
FROM `3g_t2_24hour_data`
WHERE `start time` = '2013-12-08'
AND `bsc6900ucell` = 'SYZIN9WA'
HAVING `vs.hsdpa.meanchthroughput.totalbytes (byte)` = max(
`vs.hsdpa.meanchthroughput.totalbytes (byte)`)
我希望它工作得更好
表名和列名太复杂了 “上面的查询没有给出结果。” 我不这么认为。不能在HAVING子句中指定没有聚合函数的列 “2013-12-08年对象SYZIN9WA有24个值。此查询应给出VS.HSDPA.MeanChThroughput.TotalBytes(字节)最大的所有字段的结果。” 如果您想要24条记录中的最大值,这很简单
SELECT *
FROM `3g_t2_24hour_data`
WHERE `start time` = '2013-12-08'
AND `bsc6900ucell` = 'SYZIN9WA'
GROUP BY `start time`
HAVING `vs.hsdpa.meanchthroughput.totalbytes (byte)` = max(
`vs.hsdpa.meanchthroughput.totalbytes (byte)`)
但若您试图找到哪一行具有整个数据集的最大值,那个么需要一点复杂的连接,如下所示
SELECT *
FROM `3g_t2_24hour_data`
WHERE `start time` = '2013-12-08'
AND `bsc6900ucell` = 'SYZIN9WA'
ORDER BY `vs.hsdpa.meanchthroughput.totalbytes (byte)` DESC
LIMIT 1
更新
对于一个对象(如BSC690UCELL='SYZIN9WA'),您的第一个查询是可以的。如果我删除此条件,那么如何才能对字段(BSC690UCELL)下的所有对象获得类似的结果 我不太明白你的评论。你能试试这个吗
SELECT t1.*
FROM `3g_t2_24hour_data` t1 INNER JOIN
(
SELECT MAX(`vs.hsdpa.meanchthroughput.totalbytes (byte)`) AS mx
FROM `3g_t2_24hour_data`
) t2 ON t1.`vs.hsdpa.meanchthroughput.totalbytes (byte)` = t2.mx
WHERE t1.`start time` = '2013-12-08'
AND t1.`bsc6900ucell` = 'SYZIN9WA'
考虑这一点的一个好方法是将条件移动到
where
子句。您希望获得与最大值匹配的值(对于给定条件):
请注意,您需要重复子查询中的where
条件以获得所需内容
至于表现。MySQL在=
符号后优化子查询方面做得非常好。MySQL的最新版本在中的方面也做得很好,尽管这是最近的优化。较旧的版本在
中执行,然后执行子查询,效率非常低
如果性能是一个问题,只需要一个索引:3g\u t2\u 24小时数据(bsc6900ucell,“开始时间”)
最后,您最初使用的having
子句在概念上确实有一定意义(换句话说,这是一个常见错误)。然而,SQL并不是这样定义的。在几乎所有SQL引擎中,此查询都会生成错误,因为具有长名称的列不在group by
子句中。MySQL允许这样做,但它会从一行中填入任意值进行比较——这不是您想要的
编辑(回应评论):
使子查询成为相关子查询:
SELECT *
FROM `3g_t2_24hour_data`
WHERE `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA' and
`vs.hsdpa.meanchthroughput.totalbytes (byte)` =
(select max( `vs.hsdpa.meanchthroughput.totalbytes (byte))
from 3g_t2_24hour_data
where `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA'
);
在不知道数据库本身中有什么的情况下很难回答这个问题。实际上,我需要从每小时数据中获得特定日期的所有对象(字段:BSC690UCELL
)的结果。结果应显示vs.hsdpa.meanchthroughput.totalbytes(byte)
在24小时内最大的行的所有值data@mojibul你好关联子查询和外部查询具有相同的WHERE条件
。我想知道你为什么要这样做。若前面的查询返回您想要的结果,那个么我的第一个查询会更快,更容易理解。谢谢。@mojibul第二,连接查询(我的第二个查询)比关联子查询快。您的第一个查询对于一个对象来说是可以的(比如BSC690UCELL
=“SYZIN9WA”)。如果我删除此条件,那么如何才能为字段(bsc6900ucell
)下的所有对象获得类似的结果。thanks@mojibul我已经更新了。但不确定它是否适合您。此查询不正确。您在having
子句中混合了“隐藏列”和聚合结果。我只是举了一个例子作为mojibul的例子,让他习惯having子句。我找到了您在这里提到的确切代码,这就是我想要的结果。但是,此查询将只为bsc6900ucell
下的一个对象提供结果。如果我希望BSC6900 UCELL
下的所有对象都有相同的结果,即每个对象都有类似的最大结果,那么上述代码中的修改应该是什么???。谢谢
SELECT *
FROM `3g_t2_24hour_data`
WHERE `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA' and
`vs.hsdpa.meanchthroughput.totalbytes (byte)` =
(select max( `vs.hsdpa.meanchthroughput.totalbytes (byte))
from 3g_t2_24hour_data
where `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA'
);
SELECT *
FROM `3g_t2_24hour_data` t1
WHERE `start time` = '2013-12-08' and
`vs.hsdpa.meanchthroughput.totalbytes (byte)` =
(select max( `vs.hsdpa.meanchthroughput.totalbytes (byte))
from 3g_t2_24hour_data t2
where `start time` = '2013-12-08' AND t1.`bsc6900ucell` = t2.`bsc6900ucell`
);