2010-02-23 3 views
0

J'ai une requête de la formeoptimisation des requêtes

SELECT UID1, UID2 d'un ami OÙ UID1 IN (SELECT UID2 d'un ami OU UID1 = '. $ User_id.) Et UID2 IN (SELECT UID2 d'un ami Où UID1 = '$ user_id. ')

le problème est maintenant que la requête imbriquée

SELECT UID2 d'un ami OU UID1 ='. $ user_id.'

renvoie un très grand nombre d'ID (environ 5000).

La structure de table de la table friend est uid1 (int), uid2 (int). Cette table est utilisée pour déterminer si deux utilisateurs sont liés ensemble en tant qu'amis.

Une solution de contournement? Puis-je écrire la requête d'une manière différente? Ou existe-t-il un autre moyen de résoudre ce problème? Je suis sûr que je ne suis pas la première personne à faire face à un tel problème.

Toute aide serait grandement appréciée.

+0

Voulez-vous obtenir tous les utilisateurs qui sont amis de '. $ User_id'? –

+0

En plus de trouver les amis, je veux aussi trouver les amis communs parmi mes amis. –

Répondre

0

Vous pouvez éliminer une sous-requête en utilisant une seule jointure avec une instruction OR. Toutefois, pour éliminer les lignes doubles, vous devez renvoyer uniquement les lignes DISTINCT.

SELECT DISTINCT f1.uid1, f1.uid2 
    FROM friend AS f1 INNER JOIN 
    friend AS f2 ON (f1.uid1 = f2.uid2 OR f1.uid2 = f2.udi) 
    WHERE f2.uid1='.$user_id.'