2017-08-24 1 views
0

Je ne sais pas si c'est un problème compliqué ou si je manque quelque chose de trivial, mais je n'arrive pas à le comprendre.MySQL - Utilise MAX() sur une colonne et retourne aussi des données du reste de la rangée?

J'ai un tableau qui répertorie les messages d'erreur et le moment où ils sont apparus:

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 ... 
groupe

I ces lignes ainsi que d'après la date et l'heure et compter combien d'erreurs sont apparues:

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

Résultant en ceci:

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

maintenant, je veux utiliser MAX() t o obtenir le plus haut errorCount. Je le fais avec une sous-sélection:

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; 

Cependant, je veux aussi la date de la journée avec le plus d'erreurs. Ajouter simplement created_at au premier SELECT ne fonctionne pas car il ne renvoie que la valeur de la première ligne.

Je ne sais pas comment faire ce travail maintenant. Peux-tu m'aider?

+0

S'il existe plus d'un jour avec le plus d'erreurs, alors comment voulez-vous les résultats? –

Répondre

1

Ajout ORDER BY clause et LIMIT le nombre d'enregistrements va chercher le résultat souhaité.

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; 

Et s'il y a beaucoup de jours avec le même errorCount, vous devez prendre une décision de choisir un jour spécifique.

Ma solution ci-dessus prend juste le jour le plus ancien avec des erreurs maximum.

+0

Je suppose que j'étais trop concentré sur l'utilisation de 'MAX()' que je n'ai pas pensé à commander les données à la place. Dans mon cas, obtenir le dernier jour est idéal. Merci beaucoup pour la réponse rapide! – Magnar

+0

@Magnar: pour le jour le plus récent, il suffit d'utiliser 'DESC' au lieu de' ASC' dans ma réponse –

1

Vous pouvez simplement ajouter limit 1 à la fin de la requête et le commander sur les erreurs comptent

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

J'espère que ceci peut vous aider.