我有3张桌子:
useractivitylog
id userid activity_type activity_id date
将存储所有用户活动。
requestfriend
opid userid friendid requesttime message source requesttype friendemail status
将存储朋友的详细信息。 userid 和 friendid 可以是用户的ID。如果用户A向用户B发送了朋友的请求,那么 userid 将包含A的id,而 friendid 将是B的ID。所以无论如何B是A的朋友而A是B的朋友。
auth_user_profiles
id user_id first_name last_name profileimage
存储用户个人资料信息。
我需要从 useractivitylog 表中选择我所有的朋友活动。我尝试了以下查询。但它没有用。
echo "select ua.*,rf.opid,aup.user_id,aup.first_name,aup.last_name,
aup.profileimage from useractivitylog as ua INNER JOIN requestfriend as rf
INNER JOIN auth_user_profiles as aup on
aup.user_id= IF (rf.userid='$userid',rf.friendid,rf.userid)
WHERE (rf.userid=$userid or rf.friendid=$userid)
and rf.status='2' and ua.userid!=$userid";
此处,$userid
是我的用户ID。实际上我想要的是检索个人资料和我的朋友的用户的活动。但是知道,即使 userid 不在我的朋友列表中,它也会返回 useractivitylog 表中的所有行。
任何人都可以帮我找到合适的查询。提前谢谢。
答案 0 :(得分:1)
这应该有效,因为您解释说您需要获取与您成为朋友的用户的活动,您首先需要将useractivitylog
表加入requestfriend
friendid
所在的useractivitylog
ON(rf.friendid =ua.userid)
1}}即auth_user_profiles
然后您需要加入userid
表,其中来自useractivitylog
表的ON(ua.userid=aup.user_id)
相等,即rf.userid
,然后使用您在OR rf.friendid = $userid
上的过滤器{1}}等于提供的用户ID,当您询问朋友活动时,我没有明确使用SELECT
ua.*,
rf.opid,
aup.user_id AS aup_user_id,
aup.first_name,
aup.last_name,
aup.profileimage
FROM
useractivitylog AS ua
INNER JOIN requestfriend AS rf ON(rf.friendid =ua.userid)
INNER JOIN auth_user_profiles AS aup ON(ua.userid=aup.user_id)
WHERE
rf.userid = $userid
AND rf.status = '2'
比较,那么为什么要将朋友的ID与给定的用户ID进行比较
SELECT
ua.*,
aup.user_id AS aup_user_id,
aup.first_name,
aup.last_name,
aup.profileimage
FROM
useractivitylog AS ua
INNER JOIN auth_user_profiles AS aup ON(ua.userid=aup.user_id)
WHERE
ua.userid IN (
SELECT friendid FROM requestfriend WHERE userid =$userid AND `status` = '2'
)
使用子选择
{{1}}
答案 1 :(得分:1)
您没有正确加入。将useractivitylog链接到其他表的唯一条件是其用户ID不是$ userid。对于表中的大多数记录都是如此,因此您几乎可以获得笛卡尔积(交叉连接)。
BTW:您也没有正确加入auth_user_profiles,因为您要与字符串'$ userid'进行比较,而不是与$ userid进行比较。
让我们重新编写语句,以便我们首先检索朋友并加入其他表格:
select
ua.*,
friend.opid,
aup.user_id,
aup.first_name,
aup.last_name,
aup.profileimage
from
(
select distinct
case when userid = $userid then friendid else userid end as id,
opid
from requestfriend
where $userid in (userid, friendid) and status = '2'
) as friend
inner join useractivitylog as ua on ua.userid = friend.id
inner join auth_user_profiles as aup on aup.user_id = friend.id;
答案 2 :(得分:0)
尝试以下查询
select * from useractivitylog a,requestfriend b,auth_user_profiles c
WHERE a.userid = b.userid and b.userid = c.userid;
答案 3 :(得分:0)
您需要添加一个字段来加入您的第一个表:
SELECT ua.*, rf.opid, aup.user_id, aup.first_name, aup.last_name, aup.profileimage
FROM useractivitylog as ua
INNER JOIN requestfriend as rf on fieldname = fieldname
INNER JOIN auth_user_profiles as aup on aup.user_id = IF (rf.userid='$userid',rf.friendid,rf.userid)
WHERE (rf.userid=$userid or rf.friendid=$userid)
AND rf.status='2'
AND ua.userid!=$userid
答案 4 :(得分:0)
您可以从另一侧转到您的数据...... 首先选择所有朋友,如果有,请获取他们的数据:
SELECT
ua.*,
rf.opid,
aup.user_id,
aup.first_name,
aup.last_name,
aup.profileimage
FROM
requestfriend AS rf
JOIN
useractivitylog AS ua ON (ua.userid = rf.friendid)
JOIN
auth_user_profiles AS uap ON (uap.userid = rf.friendid)
WHERE rf.userid = $userid AND rf.status = '2'
其余的请求表中的反之亦然连接应该没问题。
由于friendrequests不应该与活动一样多,如果您有大量数据,这可能会带来更好的性能......