9
votes

MySQL Sélectionnez Top lignes avec les mêmes valeurs de condition

Je ne sais pas comment titer ce problème. Corrigez-moi si vous avez de meilleurs mots.

J'ai deux tables, utilisateurs et messages. P>

Utilisateurs: strong> p>

User 1  | 14
User 2  | 13
...
User 9  | 4
User 10 | 4


3 commentaires

Problème très intéressant :) peut avoir besoin d'une variable dans la requête, voyons ce que les gens montent.


Cela vous dérange-t-il d'ajouter des données d'échantillons afin que nous puissions voir de belles violences?


@HANKY 웃 PANKY J'ai simplifié mes données ici. Si vous souhaitez tester, vous pouvez essayer le cas "Top 2" où vous pouvez facilement simuler certaines données.


3 Réponses :


0
votes

Essayez ceci:

SELECT username, PostCount
FROM (SELECT username, PostCount, IF(@PostCount = @PostCount:=PostCount, @idx:=@idx+1, @Idx:=1) AS idx
      FROM (SELECT u.username, COUNT(p.id) AS PostCount 
            FROM Posts p
            INNER JOIN Users u ON u.id=p.author_id
            GROUP BY p.author_id 
           ) AS A, (SELECT @PostCount:=0, @Idx:=1) AS B
      ORDER BY PostCount DESC
     ) AS A
WHERE idx <= 10;


1 commentaires

Vous faites une sous-requête pour chaque auteur d'extraire le postcompte et vous essayez de regrouper l'utilisateur par leur post-encote, et je pense que c'est un peu non-sens ..



3
votes

Peut-être pas la meilleure solution xxx


4 commentaires

Ne devrait-il pas être ayant compter (p.id) dans ? Si vous utilisez > = , la sous-requête doit renvoyer une seule valeur. Vous pouvez modifier la sous-requête pour utiliser limite 9, 1 .


Vous ne devriez pas utiliser distinct .


J'ai mis en œuvre @Barmar Suggestion dans ma réponse, je pense être le bon


Essayé la réponse de @jean et a travaillé. Cette réponse ne fait que rapporter "cette version de MySQL ne supporte pas encore" LIMITY & IN / Tout / TOUT / UN SUBQUERY "". Ma version MySQL est 5.6.20.



5
votes

C'est la bonne solution, je pense: vous avez besoin de la sous-requête pour savoir combien de message a la 10ème place dans votre top dix. Ensuite, vous utilisez la requête externe pour extraire les utilisateurs de presque ce postcompte.

SELECT u.username, COUNT(p.id) AS count 
FROM Posts p
JOIN Users u ON u.id = p.author_id
GROUP BY p.author_id 
HAVING COUNT(p.id) >= 
(
    SELECT COUNT(p.id) AS count 
    FROM Posts p
    JOIN Users u ON u.id = p.author_id
    GROUP BY p.author_id 
    ORDER BY count DESC
    LIMIT 9, 1
)
ORDER BY count DESC


2 commentaires

Je pense que cela devrait être limite 9, 1 .


Désolé mon mauvais! Édité