MySql中的多个内部联接无法正常工作

时间:2014-04-14 06:57:29

标签: php mysql inner-join

我有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 表中的所有行。

任何人都可以帮我找到合适的查询。提前谢谢。

5 个答案:

答案 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不应该与活动一样多,如果您有大量数据,这可能会带来更好的性能......