我有 3 个表:
用户事件日志
id userid activity_type activity_id date
这将存储所有用户事件。
请求好友
opid userid friendid requesttime message source requesttype friendemail status
这将存储 friend 的详细信息。 userid 和friendid 可以是用户的id。如果用户 A 向用户 B 发送了好友请求,那么 userid 将包含 A 的 id,friendid 将是 B 的 id。所以无论如何 B 都是 A 的好友A 是 B 的 friend 。
auth_user_profiles
id user_id first_name last_name profileimage
存储用户个人资料信息。
我需要的是从useractivitylog 表中选择我所有 friend 的事件。我尝试了以下查询。但它没有用。
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。实际上我想要的是检索个人资料信息和我 friend 的用户的事件。但是要知道,即使 userid 不在我的好友列表中,它也会返回 useractivitylog 表中的所有行。
谁能帮我找到一个合适的查询。提前致谢。
最佳答案
您没有正确加入。将 useractivitylog 链接到其他表的唯一条件是它的用户 ID 不是 $userid。对于表中的大多数记录都是如此,因此您几乎得到笛卡尔积(交叉连接)。
顺便说一句:您也没有正确加入 auth_user_profiles,因为您与字符串 '$userid' 进行比较,而不是与 $userid 进行比较。
让我们重新编写语句,以便我们首先检索 friend 并用这些连接其他表:
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;
关于php - MySql 中的多个内部连接不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23053809/