2010-09-17 33 views
1

J'essaie d'écrire une requête qui retourne une information de profil d'utilisateur, avec un nombre d'occurrences de l'ID de l'utilisateur dans 2 colonnes d'une autre table. Un exemple ci-dessous:MySQL joindre plusieurs colonnes de la même table

TableA 
userID userName 
1  UserA 
2  UserB 

TableB 
LinkID leadID followID 
1  1  2 
2  1  3 
3  2  1 

Interrogation contre 1 UserID j'attendre à récupérer UserA, (occurences de 1 à leadID) et (occurences de 1 à followID). Toute aide avec ceci est très appréciée, et merci d'avance.

Répondre

0
SELECT a.userName, 
     SUM(IF(b.leadId = a.userId, 1, 0) as Leads, 
     SUM(IF(b.followId = a.userId, 1, 0) as Follows 
FROM TableA a 
    TableB b 
GROUP BY a.userName 
3

Vous n'avez pas besoin de joindre pour cela - vous pouvez effectuer trois sélections distinctes.

SELECT 
(
    SELECT userName 
    FROM TableA 
    WHERE userID = 1 
) AS userName, 
(
    SELECT COUNT(*) 
    FROM TableB 
    WHERE leadID = 1 
) AS count_leadID, 
(
    SELECT COUNT(*) 
    FROM TableB 
    WHERE followID = 1 
) AS count_followID 

Résultat:

 
userName count_leadID count_followID 
UserA  2    1    
0
SELECT a.userName, 
     b1.count(*) as leads, 
     b2.count(*) as follows 
FROM TableA a 
INNER JOIN TableB b1 on a.userID = b1.leadID 
INNER JOIN TableB b2 on a.userID = b2.followID 
GROUP BY a.userName 

Selon la façon dont mySQL optimise et si vous avez un index sur leadID et followID cela pourrait accélérer la requête, surtout si vous allez interroger juste quelques utilisateurs plutôt que tous en même temps.

+0

Je reçois des erreurs de syntaxe avec cette requête, Jeff. Je crois que j'ai fait quelque chose de similaire plus tôt et il a retourné la même valeur pour les deux pistes et suit - ce qui est incorrect. – BenTheDesigner

+0

Oui, vous le feriez, c'était une erreur stupide. Mais en utilisant les mêmes SOMMES que Mike utilise ci-dessus au lieu d'utiliser des comptes comme je le faisais stupidement devrait fonctionner. –