Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带有where子句和having的Max查询_Mysql_Having - Fatal编程技术网

Mysql 带有where子句和having的Max查询

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

上面的查询没有给出结果。但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.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`
           );