我有一个应用程序,非常基本的描述:
我需要的是一个查询,以检查是否允许用户“喜欢”他们的一个朋友的活动。只有当其中一个用户朋友绑定到目标活动时才允许使用它们。
users: id, name
usersFriends: id, uid, friendUid
activities: id, description
activitiesUsers: id, activityId, uid
activitiesLikes: id, activityId, uid
我希望有人可以帮我解决这个问题,如果可能的话,可以返回true或false。我希望我的问题很明确,谢谢你的时间:)。
答案 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