2017-08-05 1 views
1

J'ai une table logins avec le schéma suivant:MySQL - Obtenez le nombre maximum d'un groupe de sous-requête

| id | user_id | weekday | 
|----|---------|---------| 
| 1 |  1 |  1 | 
| 2 |  1 |  2 | 
| 3 |  1 |  2 | 

... 

Weekday est un nombre de 0 à 6.

Je veux que weekday a le nombre le plus élevé, pour chaque user_id dans le tableau.

J'ai essayé la requête suivante:

SELECT MAX(num) as max_num, user_id, weekday 
FROM (
    SELECT COUNT(*) as num, user_id, weekday 
    FROM logins 
    GROUP BY user_id, weekday 
) C 
WHERE user_id = C.user_id AND num = C.num 
GROUP BY user_id; 

Ce qui me fait weekday = 1 au lieu de 2. Je pense que je ne devrais pas utiliser une clause WHERE ici, mais je n'ai pas réussi à obtenir le bon résultat.

J'ai vérifié d'autres questions semblables sans chance, tels que:

J'ai créé un Fiddle SQL avec mon exemple: http://sqlfiddle.com/#!9/e43a71/1

Répondre

0

Voici l'heure ODE:

SELECT user_id, MAX(num) as max_num, 
     SUBSTRING_INDEX(GROUP_CONCAT(weekday ORDER BY num DESC), ',', 1) as weekday_max 
FROM (SELECT user_id, weekday, COUNT(*) as num 
     FROM logins l 
     GROUP BY user_id, weekday 
    ) uw 
GROUP BY user_id; 
+0

Notez que 'count (*)' peut ne pas toujours parfaitement dans InnoDB en raison d'un bug qui est tout à l'heure fixée dans MySQL 5.7.19. J'ai eu ce problème plus tôt. Semble fonctionner correctement après la mise à niveau vers la version 5.7.19. https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-19.html –

+0

@Marc. . . Tu préfères vraiment l'autre réponse à celle-ci? –

0
SELECT days.user_id, days.weekday, days.num 
FROM (
    SELECT user_id, MAX(num) AS num 
    FROM (
     SELECT user_id, weekday, COUNT(*) AS num 
     FROM logins 
     GROUP BY user_id, weekday 
    ) max 
    GROUP BY user_id 
) nums 
JOIN (
    SELECT user_id, weekday, COUNT(*) as num 
    FROM logins 
    GROUP BY user_id, weekday 
) days ON(days.user_id = nums.user_id AND days.num = nums.num); 

-- With Mariadb 10.2 or MySQL 8.0.2 
WITH days AS (
    SELECT user_id, weekday, COUNT(*) as num 
    FROM logins 
    GROUP BY user_id, weekday 
) 
SELECT days.user_id, days.weekday, days.num 
FROM (
    SELECT user_id, MAX(num) AS num 
    FROM days 
    GROUP BY user_id 
) nums 
JOIN days ON(days.user_id = nums.user_id AND days.num = nums.num); 
+0

Si vous avez Mariadb 10.2, ou MySQL 8.0.2+, vous pouvez écrire une requête meilleure et plus courte en utilisant la fonction de la fenêtre, ou avec la déclaration. –