2012-07-25 5 views
2

메시지, 사용자 및 친구 테이블이 3 개 있습니다. 사용자가 다른 사용자와 친구가되면SQL Join Statement : 사용자의 친구 및 사용자의 메시지를 모두 수집합니다.

Messages: msg_id, uid_fk, message, alert, created, uploads, owner 
Users: uid, first_name, last_name 
Friends: friend_one, friend_one 

, 나는 다음과 같은 방식으로 자신의 UID의 기록 : friend_one를 : 172 friend_two : 58 | friend_one : 58 friend_two : 172 아래 코드는 완벽하게 작동하며 사용자의 모든 메시지 업데이트를 선택합니다. 내 문제는 내가 자신의 메시지뿐만 아니라 자신의 친구들의 메시지도 모두 선택해야한다는 것이다.

아래에서 언급 한 내용은 사용자의 상태 업데이트 만 선택하고 사용자의 상태 업데이트뿐만 아니라 자신의 친구를 선택하는 데 많은 시간을 할애하고 있습니다.

$friends_sql = $db->prepare("SELECT a.first_name, a.uid, a.last_name FROM users 
a, friends b WHERE a.uid = b.friend_two AND b.friend_one = :friend_one ORDER BY 
b.friend_id DESC LIMIT 8"); 
$friends_sql->execute(array(':friend_one' => $uid)); 
+0

'$ db-> prepare' 호출의 인용 부호 안에 캐리지 리턴을 넣을 수 있습니다. 따라서 마이클 프레드릭슨 (Michael Fredrickson)의 답변에 따라 SQL을 쉽게 읽을 수있는 형식으로 구성 할 수 있습니다.이 대답은 여러분과 여러분의 코드를 본 다른 모든 사람들에게 쉽게 따라 할 수 있습니다. – halfer

+0

오, 그게 실제로 도움이 될 것 같습니다. 팁 고마워. – user1011713

답변

3

다음은 사용자의 가장 최근의 10 개의 메시지를 반환해야 다음 및 사용자의 친구.

SELECT 
    M.msg_id, 
    M.uid_fk, 
    M.message, 
    M.alert, 
    M.created, 
    M.uploads, 
    M.owner, 
    U.uid, 
    U.first_name, 
    U.last_name 
FROM 
    users u 
    JOIN messages m ON m.uid_fk = u.uid 
WHERE 
    u.uid = :uid 
    OR u.uid IN (
     SELECT f.friend_two 
     FROM friends f 
     WHERE f.friend_one = :uid 
    ) 
ORDER BY m.created DESC 
LIMIT 10 
+0

이것은 일을했다. 다시 한 번 감사드립니다. – user1011713

0

상태 업데이트를 선택하는 귀하의 SQL 쿼리를 모두 찾습니다

$query = $db->prepare("SELECT M.msg_id, M.uid_fk, M.message, M.alert, 
M.created, M.uploads , M.owner , U.uid , U.first_name , U.last_name FROM 
messages M, users U WHERE M.uid_fk=U.uid and M.uid_fk= :uid_fk limit 10"); 
$query->execute(array(':uid_fk' => $uid)); 

은 또한 단지의 경우 친구를 선택하는 내 코드 ($의 UID는 로그인 한 사용자의 세션 ID입니다) 사용자 ID가 주어진 단일 값 (즉, 사용자의 사용자 ID 값) 인 곳을 업데이트합니다.

대신, 사용자 ID 목록에 모든 업데이트를 찾기 위해 그것을 물어 :

$query = $db->prepare("SELECT M.msg_id, M.uid_fk, M.message, M.alert, 
M.created, M.uploads , M.owner , U.uid , U.first_name , U.last_name FROM 
messages M, users U WHERE M.uid_fk=U.uid and (M.uid_fk IN ( 
    SELECT friend_two FROM friends WHERE friend_one = :uid_fk 
) OR M.uid_fk = :uid_fk) limit 10"); 
$query->execute(array(':uid_fk' => $uid)); 

또는 ...

$query = $db->prepare("SELECT M.msg_id, M.uid_fk, M.message, M.alert, 
M.created, M.uploads , M.owner , U.uid , U.first_name , U.last_name FROM 
messages M, users U WHERE M.uid_fk=U.uid and M.uid_fk IN ( 
    (SELECT :uid_fk) UNION 
    (SELECT friend_two FROM friends WHERE friend_one = :uid_fk) 
) limit 10"); 
$query->execute(array(':uid_fk' => $uid)); 
+0

죄송합니다. 작동하지 않습니다. – user1011713

관련 문제