2010-11-21 4 views
0

:MySQL의 결합 세 개의 테이블 내가처럼 보이는 세 개의 MySQL의 테이블을 사용하고 있습니다 문제

회원의 표는 친구의 목록을

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

표 계정을 :

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

사용자 갤러리 용 테이블 :

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

이 세 테이블에 가입하여 친구 목록에 추가 한 사용자와 내가 동시에 목록에 추가 한 사용자를 나열하는 쿼리 결과를 얻으려는 경우이 사용자는 모두 '1'상태 여야합니다. 회원 테이블과 갤러리 테이블에서 자신의 사진을 표시합니다.

이 예제에서 내 ID는 '10'입니다. 갤러리 필드의 표에서 'MyID'는 친구에게 다른 사용자를 추가 한 사용자를 나타내며 '사용자'는 추가 된 사용자의 ID입니다.

이 예에서 최종 결과가 같아야합니다 :

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

내가 어떻게 할 수 있습니까?

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

가입 할 수없는 이유를 배울 필요가 없다면 여기에서 필요한 것을 얻을 수 있습니다. http://dev.mysql.com/doc/refman/5.1/en/join.html – cristian

답변

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

지금 물건에 의해 그룹을 풀어 위해 이제, 이제 하위 쿼리에 대한 보자

당신이에 인덱스가 있는지 확인 다음 항목 :

accounts.id 
friends.myid 
friends.user 
,451,515,

그리고이 쿼리 실행 : 긴 수행 방법

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 

그런 다음 다시 게시합니다.

+0

@ Pentium10 - Thanks Pentium10. 이 쿼리를 시도했지만 5 분 이상 걸리고 mysql 서버가 작동하지 않습니다. 왜 어떤 이유가 있습니까? – Sergio

+0

테이블 스키마를 표시하면 키 열에 일부 인덱스가 누락되었을 수 있습니다. 또한 쿼리에서'explain extended'를 실행하고 세부 사항을 게시하십시오. – Pentium10

+0

@ Pentium10 - 내 질문에 MySQL의 설명을 볼 수 있습니다. 방금 그 내용을 게시합니다. 감사. – Sergio

관련 문제