需要MySQL查询以根据最常出现的行检索第二个值

时间:2013-01-09 16:44:15

标签: mysql sum

以下查询检测到diallednumber的出现次数最多:

SELECT COUNT( * ) AS  `Rows` , diallednumber
FROM logData
GROUP BY diallednumber
ORDER BY  `Rows` DESC 
LIMIT 20

我有另一列显示diallednumber的费用。

我无法根据发生的次数编写查询以提供最昂贵的diallednumber

2 个答案:

答案 0 :(得分:2)

每个号码的呼叫数

SELECT COUNT(*) AS calls, dialledNumber
  FROM logData
 GROUP BY dialledNumber

对号码的最大呼叫数

SELECT MAX(calls) AS maxCalls
  FROM (SELECT COUNT(*) AS calls, dialledNumber
          FROM logData
         GROUP BY dialledNumber
       ) AS c

具有最大呼叫数的呼叫成本总和

SELECT SUM(l.cost), l.dialledNumber
  FROM logData AS l
  JOIN (SELECT COUNT(*) AS calls, dialledNumber
          FROM logData
         GROUP BY dialledNumber
       ) AS c
    ON l.dialledNumber = c.dialledNumber
  JOIN (SELECT MAX(calls) AS maxCalls
          FROM (SELECT COUNT(*) AS calls, dialledNumber
                  FROM logData
                 GROUP BY dialledNumber
               )
       ) AS m
    ON m.maxCalls = c.calls

如果有两个号码具有相同的最大呼叫数,则两者都将显示。如果你想获得花哨的话,你可以花费最多的费用。

m子查询可以在没有连接的情况下用作“简单”数字:

SELECT SUM(l.cost), l.dialledNumber
  FROM logData AS l
  JOIN (SELECT COUNT(*) AS calls, dialledNumber
          FROM logData
         GROUP BY dialledNumber
       ) AS c
    ON l.dialledNumber = c.dialledNumber
   AND c.calls = (SELECT MAX(calls) AS maxCalls
                    FROM (SELECT COUNT(*) AS calls, dialledNumber
                            FROM logData
                           GROUP BY dialledNumber
                         )
                 ) AS m

一个优秀的优化器将对两者使用相同的查询计划。

答案 1 :(得分:0)

最大的成本:

SELECT diallednumber
     , COUNT(diallednumber)
     , SUM(cost) 
  FROM logdata 
 GROUP 
    BY diallednumber 
 ORDER 
    BY SUM(cost) DESC LIMIT 1;