2010-05-19 3 views
2

Je ne suis pas sûr de la meilleure façon de répondre à cette question alors supportez-moi.Mysql: Résultats de l'ordre par le nombre de rangées correspondantes dans la deuxième table

Tableau A présente les colonnes suivantes:

  • id
  • nom
  • Description

Le tableau B présente les colonnes suivantes:

  • id
  • a_id (clé étrangère au tableau A)
  • ip_address
  • Date

Fondamentalement, le tableau B contient une ligne pour chaque fois qu'un utilisateur affiche une ligne du tableau A.

Ma question est de savoir comment faire Je tri Tableau A les résultats, sur la base du nombre de lignes correspondant au tableau B.

ie

SELECT * 
    FROM TableA 
ORDER BY (SELECT COUNT(*) 
      FROM TableB 
      where TableB.a_id = TableA.id) 

Merci!

+0

Quel est le problème avec la requête que vous avez déjà? –

+1

Wow. J'ai écrit cette requête comme Pseudo-code sans réellement penser à le tester. Je n'ai jamais pensé que ça marcherait mais je l'ai testé et ça fonctionne comme un charme! – KyleT

Répondre

3
SELECT a.* 
     , b.cnt 
     FROM TableA a 
    LEFT OUTER JOIN (SELECT a_id 
         , COUNT(*) cnt 
         FROM TableB b 
        GROUP BY a_id) b 
    ON a.id = b.a_id 
    ORDER BY b.cnt 
+1

Remarque: Ceci omet les lignes du résultat si elles n'ont pas de lignes dans la TableB. –

+1

@Mark Byers - Correction. – dcp

+0

Merci pour toutes les réponses à tous. Merci dcp, cela a fonctionné comme un charme! – KyleT

0

Quelque chose comme ça pourrait faire l'affaire.

select a.id, a.name, a.description, count(b.id) as count 
    from TableA as a 
    inner join TableB as b on a.id = b.a_id 
    group by a.id, a.name, a.description order by count 
+1

Remarque: Ceci omet les lignes du résultat si elles n'ont pas de lignes dans la TableB. –

0

Votre requête fait déjà ce que vous voulez. Vous pouvez ajouter DESC si vous voulez que les lignes avec le plus grand nombre de lignes d'abord:

SELECT * FROM TableA 
ORDER BY (SELECT COUNT(*) FROM TableB where TableB.a_id = TableA.id) DESC 
0
SELECT a.id, a.name, a.description, count(b.id) FROM TableA a 
    JOIN TableB b on b.a_id = a.id 
GROUP BY a.id, a.name, a.description ORDER BY COUNT(b.id); 

Vous pouvez ajouter un DESC à l'ORDER BY, peut-être c'est-ce que vous avez besoin:

SELECT a.id, a.name, a.description, count(b.id) FROM TableA a 
    JOIN TableB b on b.a_id = a.id 
GROUP BY a.id, a.name, a.description ORDER BY COUNT(b.id) DESC; 
Questions connexes