2017-08-24 51 views
0

我不確定這是一個複雜的問題,還是我錯過了一些微不足道的事情,但我無法弄清楚這一點。MySQL - 在一列上使用MAX(),並從行的其餘部分返回數據?

我有一個列出的錯誤消息,他們出現在時間的表:

id  created_at   content 
1  2017-08-05 08:00 ... 
2  2017-08-15 16:00 ... 
3  2017-08-15 16:01 ... 
4  2017-08-15 16:02 ... 
5  2017-08-25 16:00 ... 

I組這些行一起根據日期和時間以及數很多錯誤是如何出現:

SELECT DATE_FORMAT(created_at, '%d.%m. %h'), 
     COUNT(*) AS errorCount 
     FROM db.errorData 
     GROUP BY DAY(created_at), HOUR(created_at); 

所得在此:

created_at   errorCount 
2017-08-05 08  1 
2017-08-15 16  3 
2017-08-25 16  1 

現在我想用MAX() t獲得最高的errorCount。我使用子查詢來做到這一點:

SELECT MAX(errorCount) AS errorMax 
     FROM(
     SELECT DATE_FORMAT(created_at, '%d.%m. %h'), 
     COUNT(*) AS errorCount 
     FROM db.errorData 
     GROUP BY DAY(created_at), HOUR(created_at) 
     ) alias; 

但是,我也想得到錯誤最多的日期。簡單地將created_at添加到第一個SELECT不起作用,因爲它只返回第一行的值。

我不知道如何使這項工作現在。你能幫我嗎?

+0

如果存在多於一天的大多數錯誤,那麼您希望結果如何? –

回答

1

添加ORDER BY條款和LIMIT的記錄數將獲取你想要的結果。

SELECT DATE_FORMAT(created_at, '%d.%m. %h') AS created_at, 
     COUNT(*) AS errorCount 
    FROM db.errorData 
GROUP BY DAY(created_at), HOUR(created_at) 
ORDER BY errorCount DESC, created_at ASC 
LIMIT 1; 

如果有很多天有相同的errorCount,你必須決定選擇一個特定的日子。

我上面的解決方案只是選擇最大的錯誤最大的一天。

+0

我想我太專注於使用'MAX()',我沒有想到訂購數據。就我而言,獲得最新的一天是理想的。快速響應非常感謝! – Magnar

+0

@Magnar:對於最新的一天,只需在我的回答中使用'DESC'代替'ASC' –

1

您可以簡單地添加limit 1到查詢的末尾,並責令有關錯誤的計數

SELECT DATE_FORMAT(created_at, '%d.%m. %h'), 
    COUNT(*) AS errorCount 
FROM db.errorData 
    GROUP BY DAY(created_at), HOUR(created_at) 
    ORDER BY errorCount DESC 
LIMIT 1; 
0
SELECT 
DATE_FORMAT (created_at, '%d.%m. %h'), 
      count(*) as errorCount 
from 
db.errordata 
groupby day(created_at) 
HAVING errorCount>= ALL (
SELECT  
COUNT(*) AS errorCount 
FROM db.errorData 
GROUP BY DAY(created_at), HOUR(created_at) 
) 

我希望這可以幫到你。

相關問題