2010-11-21 6 views
0

J'utilise trois tables de MySQL qui ressemble à:Mysql se joindre à trois tables problème

Le tableau des membres comptes

|  id  |  name | status | 
------------------------------------------- 
|  1  |  mike |  0  | 
|  2  |  peter |  1  | 
|  3  |  john |  1  | 
|  4  |  any |  1  | 

Le tableau pour la liste d'amis:

| myid  | user  | date | 
------------------------------------------ 
|  10  |  2  | 2010-01-04 | 
|  3  |  10  | 2010-09-05 | 
|  4  |  10  | 2010-10-23 | 

Le table pour les utilisateurs galeries:

| fotoid  | userid  | pic1 | 
------------------------------------------ 
|  101  |  2  | 1.jpg | 
|  102  |  3  | 2.jpg | 
|  103  |  4  | 3.jpg | 

Je veux rejoindre ces trois tables et obtenir le résultat de la requête qui listera les utilisateurs que j'ai ajoutés à la liste d'amis et ceux qui m'ont ajouté à la liste en même temps, tous ces utilisateurs doivent avoir le statut '1' la table des membres et afficher leurs photos de la table de la galerie.

Dans cet exemple, mon ID est '10'. Dans le tableau du champ des galeries, 'MyID' représente les utilisateurs qui ont ajouté d'autres utilisateurs à leurs amis tandis que 'user' est l'identifiant des utilisateurs ajoutés.

Le résultat final dans cet exemple devrait ressembler à:

| id | name | status | pic1 | 
------------------------------------------------ 
| 2  | peter |  1  | 1.jpg | 
| 3  | john |  1  | 2.jpg | 
| 4  | any  |  1  | 3.jpg | 

Comment puis-je faire cela?

mysql EXPLIQUEZ:

id | select_type  | table | type | possible_keys | key | key_len | ref | rows | extra        
------------------------------------------------------------------------------------------------------------------------------------------------- 
1 | primary   | g  | ALL  | id    | NULL | NULL  | NULL | 7925 | Using where 
1 | primary   | a  | eg_ref | id    | id  | 4   | g.id | 1  | Using where 
2 |DEPENDENT SUBQUERY| a2 | index | id    | NULL | NULL  | NULL | 90734 | Using index; Using temporary; Using filesort; 
2 |DEPENDENT SUBQUERY| f  | index | rds_index  |rds_index| 8   | NULL | 138945 | Using where;Using index;Using join buffer 
+0

Si vous ne pouvez pas faire une jointure pourquoi ne pas apprendre Vous avez ici ce que vous avez besoin http://dev.mysql.com/doc/refman/5.1/fr/join.html – cristian

Répondre

2
SELECT a.id, 
     a.name, 
     a.status, 
     g.pic1 
FROM accounts a 
     JOIN galleries g 
     ON g.userid = a.id 
WHERE a.id IN (SELECT a2.id 
       FROM accounts a2 
         JOIN friends f 
         ON (f.myid = a2.id 
           OR f.user = a2.id) 
       WHERE (f.myid = 10 
          OR f.user = 10) 
       GROUP BY a2.id) 
     and a.status = 1 

EDIT 1

Prenons pour l'instant la sous-requête, pour perdre maintenant le groupe par la substance:

Assurez-vous que vous avez des index sur ces colonnes:

accounts.id 
friends.myid 
friends.user 

Et exécuter cette requête:

SELECT a2.id 
FROM accounts a2 
     JOIN friends f 
     ON f.myid = a2.id 
WHERE f.user = 10 
UNION ALL 
SELECT a2.id 
FROM accounts a2 
     JOIN friends f 
     ON f.user = a2.id 
WHERE f.myid = 10 

puis après retour combien de temps effectué.

+0

@ Pentium10 - Merci Pentium10. J'ai essayé cette requête mais cela prend plus de 5 minutes et le serveur mysql est bloqué. Y a-t-il une raison pour laquelle? – Sergio

+0

Montrez-nous votre schéma de table, il vous manque probablement des index sur vos colonnes clés. Exécutez également 'explain extended' sur la requête et publiez les détails. – Pentium10

+0

@ Pentium10 - Vous pouvez voir les détails de mysql expliquer dans ma question. Je viens de poster ces détails. Merci. – Sergio