2013-04-23 2 views
0

나는 2 개 테이블이 있습니다왼쪽/내부가 함께 참여 AND, WHERE 및 OR

친구 ID 원래 친구 요청을 보낸 사람

ID | Profile | Check 
------+-----------+--------- 
    int | int | bool 

, Profile이 사람 요청의 ID가 전송되었습니다됩니다 Check은 0 = 요청 보류 중입니다. 1 = 요청을 수락했습니다.

메시지

OwnerID 메시지를 작성한 회원의 ID입니다
OwnerID | ... 
-----------+------- 
    int | ... 

.

그래서 기본적으로 내가 무엇을보고하고하는 것은 처음이다 : ID 또는 프로필이 MEMBERID 쿠키와 같은 곳

이 friends_list 테이블에서 모든 행을 선택합니다. 그러나 내 처참한 heres : 다른 사용자에게 친구 요청을 보내면 내 ID가 ID 필드에 배치되고 그들의 ID는 friend_list 테이블의 프로필 필드에 배치됩니다. 그러나 다른 사용자가 나에게 친구 요청을 요청하면 내 ID가 프로필 입력란에 들어가고 ID 입력란에 입력됩니다.

따라서 ID = 1이고 프로필 = 2 인 행이 있습니다. 다음 행은 ID = 3이고 프로필 = 1입니다. 이제 ID가 2와 3 인 두 사용자는 모두 내 친구입니다 (ID 1) 그래서, 1에서 2, 3 (광산 내 두 친구의 모든 메시지를 표시해야합니다) 확인 어디에 = 1

+0

SELECT * FROM 메시지, 친구 어디에서 YOURCOOKIEID '(ID,'Profile')를 입력하십시오. –

답변

1

내가 당신이 원하는 것은 이것이다 생각 :

(
    SELECT m.* 
    FROM Messages m 
    INNER JOIN Friends f ON m.OwnerID = f.ID 
    WHERE f.Profile = ? 
) UNION (
    SELECT m.* 
    FROM Messages m 
    INNER JOIN Friends f ON m.OwnerID = f.Profile 
    WHERE f.ID = ? 
) 

당신을 이 두 가지 별도의 쿼리를 볼 필요가, 나는 당신이 현명하게 이것을 할 수 있다고 생각하지 않는다 그냥 조합의 JOIN 초.

UNION의 기본 수정자가 DISTINCT이므로 MySQL을 사용한다고 가정하면 중복 행을 반환하지 않아야합니다. 다른 RDBMS 엔진에서는 명시 적으로 이것을 설명하거나 다른 해결 방법을 사용해야 할 수도 있습니다 (예 : 실제 메시지 ID에 GROUP BY).

두 요청의 WHERE 절에 m.Check = 1 조건을 추가하여 친구 요청이 수락 된 메시지 만받을 수 있도록 할 수 있습니다.

분명히 위의 두 자리 표시자가 같은 데이터로 대체되는 준비된 문인 memberID 쿠키로 사용되도록 설계되었습니다.

+0

좋아, 나는 하루 종일 놀았고, 일종의 일을했습니다. 적어도 내 사이트에서는 그렇지만, 친구 사이트에 신청할 때 그것은 그렇지 않습니다. 내부 조인에서 OR을 사용하는 방법이 있습니까? 무슨 뜻입니까? 나는 : INNER JOIN'메시지''p''''''''''''''''''''''''''' 내가 원하는 것은 : –