使用where子句进行最大查询

时间:2013-12-14 09:57:35

标签: mysql having

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)`) 

以上查询没有给出结果。但2013-12-08对象SYZIN9WA有24个值。此查询应该给出VS.HSDPA.MeanChThroughput.TotalBytes (byte)最大的所有字段的结果。

3 个答案:

答案 0 :(得分:2)

您应该将Group BY与having子句一起使用:

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)`)

我希望它有效。

http://www.w3schools.com/sql/sql_having.asp

答案 1 :(得分:0)

这是如此复杂的表名和列名......

  

“上述查询没有结果。

我不这么认为。没有聚合函数的列不能在HAVING子句中指定。

  

“2013-12-08中对象SYZIN9WA有24个值。此查询应该给出VS.HSDPA.MeanChThroughput.TotalBytes(byte)最大的所有字段的结果。”

如果您想要24条记录中的最大值,那很简单。

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

但是如果你试图找到哪一行具有整个数据集的最大值,则需要一点点复杂的JOIN,如下所示。

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' 

更新

  

“你的第一个查询对于一个对象是好的(比如bsc6900ucell ='SYZIN9WA')。如果我删除了这个条件,那我怎样才能得到字段下所有对象的相似结果(bsc6900ucell)。”

不确定我理解你的评论。你能试试吗?

SELECT t1.*
FROM   `3g_t2_24hour_data` t1 INNER JOIN
(
    SELECT `bsc6900ucell`,
        MAX(`vs.hsdpa.meanchthroughput.totalbytes (byte)`) AS mx
    FROM `3g_t2_24hour_data`
    GROUP BY `bsc6900ucell`
) t2 ON t1.`vs.hsdpa.meanchthroughput.totalbytes (byte)` = t2.mx
  AND t1.`bsc6900ucell` = t2.`bsc6900ucell`
WHERE  t1.`start time` = '2013-12-08' ;

答案 2 :(得分:0)

考虑这个问题的好方法是将条件移到where子句。您希望获得与最大值匹配的值(对于给定条件):

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'
           );

请注意,您需要在子查询中重复where条件才能获得所需内容。

至于表现。 MySQL在=符号后优化子查询方面做得非常好。最新版本的MySQL也适用于in,尽管这是最近的优化。旧版本实现in后跟子查询非常低效。

如果性能问题,只需一个索引:3g_t2_24hour_data(bsc6900ucell, "start time")

最后,你对having子句的原始使用确实在概念上有所了解(换句话说,这是一个常见的错误)。但是,这不是SQL的定义方式。在几乎所有SQL引擎中,此查询都会生成错误,因为具有长名称的列不在group by子句中。 MySQL允许这样做,但它会从单行填充任意值进行比较 - 这不是你想要的。

编辑(回应评论):

使子查询成为相关的子查询:

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`
           );