php mysql join存在

时间:2012-02-29 18:37:39

标签: php mysql

我有一个应用程序,非常基本的描述:

  1. 用户登录 - >他们发布“活动”(如滑雪板)
  2. 用户有朋友
  3. 用户可以将多个朋友绑定到活动
  4. 用户可以“喜欢”由朋友创建的活动
  5. 我需要的是一个查询,以检查是否允许用户“喜欢”他们的一个朋友的活动。只有当其中一个用户朋友绑定到目标活动时才允许使用它们。

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

    我希望有人可以帮我解决这个问题,如果可能的话,可以返回true或false。我希望我的问题很明确,谢谢你的时间:)。

4 个答案:

答案 0 :(得分:1)

这应该为所有用户的朋友生成activities.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.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
)

或者IN()子句试图从任何用户的朋友拥有的activities获取所有内容。

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

答案 1 :(得分:1)

假设您在查询时知道用户的ID和活动ID,您可以执行以下操作:

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

如果他们的朋友没有绑定到该活动,则应该返回0;如果他们有朋友绑定到该活动,则应该返回正数...

答案 2 :(得分: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

答案 3 :(得分:1)

SELECT COUNT(*) AS allowed
FROM userFriends
JOIN activitiesUsers ON (userFriends.uid = activitiesUsers.uid
    AND activitiesUsers.activityId = $activity_id)
WHERE userFriends.uid = $user_id