2012-06-11 2 views
0

프로필 pic, 출신지, 사용자 ID 및 특정 사용자와 친구가되도록 요청한 사용자의 전체 이름을 보여주는 친구 요청 스크립트를 선택하는 다음 쿼리가 있습니다.SQL Select user

SELECT 
    a.hometown, 
    a.first_name, 
    a.uid, 
    a.last_name, 
    b.friend_one, 
    b.friend_two, 
    b.friend_request_id, 
    p.thumbnail 
FROM 
    users a, 
    friend_requester b, 
    profile_pics p 
WHERE 
    a.uid = b.friend_one 
AND b.friend_two = $uid 
AND p.uid_fk = $uid 
ORDER BY b.created DESC LIMIT 5 

내 문제는 대신 friend_requester 테이블에있는 각 쿼리에 대한 1 사용자를 반환하는, 내가 다른 프로필 사진과 함께 동일한 사용자의 예를 들어 3의 인스턴스를 돌려 줄 것입니다. 사용자가 3 개 프로필 사진을 업로드 한 경우 나 동일한 사용자의 3 가지 박스는 로그인 한 사용자와 친구가 될 것을 요청받을

id=1, profile_pic=profile_pic1.jpg... 

id=1 profile_pic=profile_pic2.jpg... 

id=1 profile_pic=profile_pic3.jpg... 

그래서 저장되는.

Hituptony가 언급했듯이 'created_'열에있는 'profile_pics'테이블의 최신 삽입 된 그림을 선택하고 싶습니다.

+0

을 'a' 또는'b'. 그렇지 않으면 이전 테이블의 모든 행에 대해 일치하는 교차 조인입니다. –

+0

gms - 아니요. $ uid가 키인 경우 가입 할 필요가 없습니다. 동일한 정적 값을 일치시켜 고유성을 이미 보장했습니다. 문제는 최적화 프로그램이이를 알 수 있는지 여부입니다. –

답변

1

그룹이 최대가 만든 얻을 및 INNER 다시 사진 테이블 조인 당신이 새로운 파생 테이블을 추가 할 수 있습니다

SELECT a.hometown, 
     a.first_name, 
     a.uid, 
     a.last_name, 
     b.friend_one, 
     b.friend_two, 
     b.friend_request_id, 
     p.thumbnail 
FROM users a 
     INNER JOIN friend_requester b 
      ON b.friend_one = a.uid 
     INNER JOIN profile_pics p 
      ON p.uid_fk = b.frind_two 
     INNER JOIN 
     ( SELECT uid_FK, MAX(Created) AS Created 
      FROM Profile_Pics 
      GROUP BY uid_FK 
     ) MaxPic 
      ON MaxPic.UID_FK = p.UID_FK 
      AND MaxPic.Created = p.Created 
WHERE p.uid_fk = $uid 
+0

안녕하세요 Gareth 저는 로그인 한 사용자의 session_id로 $ uid를 사용하므로 코드가 잘 작동하지만 친구 요청자가 아닌 로그인 한 사용자의 미리보기 이미지와 일치하는 미리보기 이미지를 잘못 가져옵니다. 어떻게 수정하겠습니까? – user1011713

+0

where 절을 'WHERE a.uid = $ uid'로 변경해야한다고 생각합니다. – GarethD

0

사진을 원하십니까? 사진에 타임 스탬프가 있어야합니다. 가장 최근의 사진을 표시하려면 사진의 날짜를 가져 와서 가장 가까운 사진() 또는 가장 오래된 사진() 또는 curdate()를 가져올 수 있습니다. ^^ 나는 당신이 순서대로 그룹화 할 수 있다고 생각하지 않지만, b.created를 선택하여 그림을 검색하는 순서를 볼 수 있습니다. Uid_FK BY

+0

죄송합니다. 언급하지 않았습니다. 'created_'열 아래 'profile_pics'테이블의 최신 삽입 된 그림이 필요합니다. – user1011713

0

당신의 가입 ("MaxPic"라고 내 하위 쿼리에서 수행), 당신 이 작업을 수행 할 수 있습니다 사진은 가장 최근이고, 그렇지 않으면 0 경우

SELECT a.hometown, a.first_name, a.uid, a.last_name, 
     b.friend_one, b.friend_two, b.friend_request_id, 
     p.thumbnail 
FROM users a, 
     friend_requester b, 
     (Select MAX(Created) as Created, uid_fk from profile_pics) p_date, 
     profile_pics p 
WHERE  
     a.uid = b.friend_one AND b.friend_two = $uid AND p.uid_fk = $uid 
     AND p_date.Created=p.Created And p_date.uid_fk=p.uid_fk 
ORDER BY b.created DESC LIMIT 5 

다른 방법으로, 당신은 하나가 포함 된 그림 테이블에있는 '플래그'열이 할 수 있습니다 - 이러한 유형의 문제처럼 보인다 그것은 많이 올 것이고, 데이터베이스가 커지고, 오래 된 그림이 모이면 성능을 얻을 것입니다. 매번 모든 항목을 확인해야하는 경우 문제가 발생합니다. 플래그를 사용하면 성능을 훨씬 쉽게 인덱싱 할 수 있습니다. 또한,이 쿼리는 추가가 필요합니다 : where flag = 1. 새 그림을 삽입 할 때마다, 당신은 플래그 1, 그리고 당신이`p`에 가입해야 할 필요는 0

환호로 설정된 모든 사용자가 다른 사진의 플래그, 데이비드