2012-02-29 4 views
0

내가하는 응용 프로그램이 존재하는, 아주 기본적인 설명 :PHP는 MySQL의 가입

  1. 사용자 로그인 -> 그들이 (스노우 보드와 같은) "활동"
  2. 사용자는 친구가
  3. 사용자가 여러 친구를 바인딩 할 수 있습니다를 게시 활동
  4. 사용자 수있는 친구

내가 필요로하는 사용자가 "좋아요"를 할 수있는 경우 확인하는 쿼리입니다 만든 활동 "과 같은" 친구 중 한 명이 활동하고 있습니다. 사용자 친구 중 하나가 대상 활동에 바인딩되었을 때만 허용됩니다.

users: id, name 
usersFriends: id, uid, friendUid 
activities: id, description 
activitiesUsers: id, activityId, uid 
activitiesLikes: id, activityId, uid 

누군가이 쿼리로 나를 도울 수 있고 가능한 경우 true 또는 false를 반환하기를 바랍니다. 내 질문에 명확하고 시간 내 주셔서 감사합니다 :)

+2

이야기에 세 명의 다른 사용자/친구가 있습니다. 예를 들어, A, B 및 C 레이블은 여러 해석을 위해 열려 있기 때문에 레이블을 지정하십시오. – CodeCaster

+0

나는 분명히 희망한다;) – randomKek

+1

변수를 정리하고 고유 한 이름으로 호출하여 나중에 혼동이 없어 지므로 id가'userid' 또는'friendid' 또는'activityid' 등이되도록한다. 이것은 깨끗하게 할뿐만 아니라, 이후의 JOINS에 대한 묵시적인 관계를 명확히합니다. – Jakub

답변

1

이것은 모든 사용자의 친구에 대한 activities.id의 목록을 생성해야합니다. 사용자의 친구의 소유 activities에서 모든 것을 얻기 위해 시도하는 IN()

SELECT activities.id FROM activities aCanLike 
WHERE EXISTS (
    SELECT 
     a.id AS canLikeId 
    FROM 
     users u 
     JOIN usersFriends uf ON u.id = uf.uid 
     JOIN activitiesUsers au ON uf.friendId = au.uid 
     JOIN activities a ON a.id = au.activityId 
    WHERE a.id = aCanLike.id 
) 

또는 뭔가 :

SELECT 
    activities.id AS canLikeId 
FROM 
    users u 
    JOIN usersFriends uf ON u.id = uf.uid 
    JOIN activitiesUsers au ON uf.friendId = au.uid 
    JOIN activities a ON a.id = au.activityId 

그것은처럼 보이는 EXISTS에 싸여.

SELECT 
    activities.* 
FROM activities JOIN activitiesUsers ON activities.id = activitiesUsers.activityId 
WHERE activitiesUsers.uid IN (
    SELECT friendUid FROM usersFriends WHERE uid = $userid 
) 
1

쿼리시 사용자의 ID 및 활동 ID를 알고 가정 할 때, 당신이 뭔가를 할 수있다 : 자신의 친구 중 어느 것도 활동에 바인딩되지 않은 경우

SELECT COUNT(*) FROM activitiesUsers WHERE activityId = 'xx' AND uid IN (SELECT friendUid FROM usersFriends WHERE uid = 'xx') 

는 0을 반환해야하거나 그들이 그 활동에 바인딩 친구가있는 경우 양수는 ...

+0

일부 상황에서 나는 subselects를 좋아하고 이것은 하나입니다. 이 쿼리는 작동해야합니다. 조인 대 subselects에 대한이 문서를 참조하십시오. http://www.codersrevolution.com/index.cfm/2008/7/31/MySQL-performance-INNER-JOIN-vs-subselect – mozillanerd

+0

@mozillanerd : 당신이 링크 한 기사는 subselect 대안이 조인보다 굉장히 느리다는 것을 보여줍니다 하나. –

1

이 그것을 수행해야합니다

select 
    count(*) as CanLike -- 0 if false, >= 1 if true 
from 
    usersFriends uf 
join 
    activitiesUsers au 
on 
    uf.friendUid = au.uid 
where 
    au.id = $activityId 
and 
    uf.uid = $userId 
1
SELECT COUNT(*) AS allowed 
FROM userFriends 
JOIN activitiesUsers ON (userFriends.uid = activitiesUsers.uid 
    AND activitiesUsers.activityId = $activity_id) 
WHERE userFriends.uid = $user_id