2010-08-31 5 views
1

J'ai une table MySQL avec computerid, userid et quelques autres colonnes. Maintenant, je veux une requête qui retournerait tous les enregistrements où la valeur computerid est partagée par plus d'un utilisateur. Retrouvez ci-dessous les données de l'échantillon:Requête MySQL pour retourner une combinaison de colonnes non unique

 
computerid userid 
100   5  
105   10  
110   6  
100   7  
101   11  
100   5  
105   10  
101   11  

Pour des données ci-dessus ensemble requête MySQL devrait revenir en dessous des résultats parce que dans ce cas ComputerID est partagée par deux codes d'utilisateur.

 
computerid userid 
100   5  
100   7  
+0

Merci pour les réponses. Juste une note - Cette table comme autour de 1 million d'enregistrements. Il y aurait peu d'enregistrements où plusieurs utilisateurs auraient le même computerid. Je me demandais juste quelle requête serait assez rapide en termes de performances. –

+0

Qu'est-ce qui est assez rapide? Savez-vous comment ajouter des index à votre table? –

+0

En outre, qu'est-ce que la requête 'SELECT COUNT (DISTINCT computerid) FROM table1' renvoie pour votre table? –

Répondre

5

Vous pouvez le faire comme ceci:

SELECT DISTINCT T2.computerid, T2.userid 
FROM (
    SELECT computerid 
    FROM table1 
    GROUP BY computerid 
    HAVING COUNT(DISTINCT userid) > 1 
) T1 
JOIN table1 T2 
ON T1.computerid = T2.computerid 

Résultat:

 
computerid userid 
100   5 
100   7 

Ajouter un index sur (ComputerID) pour améliorer les performances.

0
SELECT DISTINCT a.computerid, a.userId 
FROM table a 
JOIN (
    SELECT computerId 
    FROM table 
    GROUP BY computerId 
    HAVING COUNT(DISTINCT userId) > 1 
) b ON a.computerId = b.computerId 
1
SELECT DISTINCT(computerid) , userid FROM table 
WHERE computerid IN 
(SELECT DISTINCT(computerid) FROM table GROUP BY computerid HAVING COUNT(computerid)>1) 
+0

Il vous manque le mot clé DISTINCT à deux endroits. –

+0

oui vous marquez bien, merci –

+0

Dans mes tests sur 100000 lignes de données de test, cette solution prend beaucoup de temps à s'exécuter. –

0

Une solution sans sous-requêtes

SELECT 
    t1.* 
FROM table t1 
LEFT JOIN table t2 
    ON t1.computerid = t2.computerid AND t1.userid != t2.userid 
WHERE 
    t2.userid IS NOT NULL 
GROUP BY 
    t1.computerid, t1.userid; 

Si l'on suppose qu'il ya peu d'ordinateurs avec plus d'un utilisateur, cela devrait être relativement rapide.

+0

JOINT GAUCHE? En outre, cela donne le mauvais résultat. –

+0

@Mark Byers: désolé, typo – Martijn

+1

Dans mes tests locaux sur 100 000 lignes de données de test, cette opération est deux fois plus lente que ma solution (1,6 s au lieu de 0,8 s). –

Questions connexes