2010-11-21 24 views
0

:MySQL katılmak üç tablo Ben benziyor üç MySQL tabloları kullanıyorum sorun

üyeleri için masa arkadaş listesi için

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

tablo hesapları:

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

Kullanıcılar galerileri için tablo:

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

Bu üç tabloya katılmak ve arkadaş listesine eklediğim kullanıcıları ve aynı zamanda listeye eklediğim kullanıcıları listeleyecek sorgu sonuçlarını almak istiyorum, tüm bu kullanıcıların '1' statüsüne sahip olması gerekir. Üyeler tablosu ve fotoğraflarını galeri tablosundan görüntüler.

Bu örnekte kimliğim 10'dur. Galeriler alanı tablosunda 'MyID', diğer kullanıcılarını arkadaşlarına ekleyen kullanıcıları gösterirken, 'kullanıcı' eklenen kullanıcıların kimliğidir.

bu örnekte sonuç gibi görünmelidir:

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

Bunu nasıl yapabilirim?

MySQL EXPLAIN:

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

Bir katılımı yapamıyorsanız neden öğrenmiyorsunuz http://dev.mysql.com/doc/refman/5.1/en/join.html – cristian

cevap

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 

DÜZENLEME 1

şimdi malzeme ile grup gevşek için en geç alt sorgu için alalım:

emin ilgili endeksler var olun bu sütunlar:

accounts.id 
friends.myid 
friends.user 

Ve bu sorguyu çalıştırın: uzun nasıl performans

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 

Sonra geri göndermek.

+0

@ Pentium10 - Teşekkürler Pentium10. Bu sorguyu denedim ama 5 dakikadan fazla sürüyor ve mysql sunucusu takılı kalıyor. Herhangi bir sebep var mı? – Sergio

+0

Tablo şemanızı bize göster, muhtemelen anahtar sütunlarınızdaki bazı dizinleri kaçırıyorsunuz. Ayrıca, sorgudaki 'genişletilmiş açıklamayı' çalıştırın ve ayrıntıları gönderin. – Pentium10

+0

@ Pentium10 - Sorgumda mysql açıklamasının ayrıntılarını görebilirsiniz. Ben sadece detayları paylaşıyorum. Teşekkürler. – Sergio