【问题标题】:Multiple inner joins in MySql not workingMySql 中的多个内部连接不起作用
【发布时间】:2014-05-28 01:00:34
【问题描述】:

我有 3 张桌子:

用户活动日志

id   userid   activity_type  activity_id   date

它将存储所有用户活动。

请求好友

opid  userid  friendid  requesttime  message  source  requesttype  friendemail  status

这将存储朋友的详细信息。 useridfriendid 可以是用户的 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 表中的所有行。

谁能帮我找到一个合适的查询。提前致谢。

【问题讨论】:

  • 你能解释一下但它没有用吗?任何错误或其他问题
  • 即使 useractivitylog 表中的用户不是我的朋友,它也会返回所有行。
  • 您有两个 JOIN,但 ON 子句中只有一个条件,这似乎是罪魁祸首。
  • 感谢 RobP ..它与 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 一起使用on (ua.userid=rf.userid or ua.userid=rf.friendid) INNER JOIN auth_user_profiles as aup on aup.user_id= IF (rf.userid='$userid',rf.friendid,rf.userid) WHERE (rf .userid=$userid 或 rf.friendid=$userid) 和 rf.status='2' 和 ua.userid!=$userid";

标签: php mysql inner-join


【解决方案1】:

您没有正确加入。将 useractivitylog 链接到其他表的唯一条件是其用户 ID 不是 $userid。对于表中的大多数记录都是如此,因此您几乎得到一个笛卡尔积(交叉连接)。

顺便说一句:您也没有正确加入 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】:

    这应该像您解释的那样工作,您需要获得与您成为朋友的用户的活动,您首先需要将useractivitylog 表加入requestfriend,其中friendiduseractivitylogON(rf.friendid =ua.userid) 然后你需要加入auth_user_profiles 表,其中useractivitylog 表中的userid 是相等的,即ON(ua.userid=aup.user_id),然后在rf.userid 上的过滤器等于提供的用户ID 时使用你,我没有明白这一点当您询问朋友活动时使用OR rf.friendid = $userid比较,那么为什么将朋友的ID与给定的用户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' 
    

    使用子选择

    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' 
    ) 
    

    【讨论】:

    • 这显示了 useractivitylog 中的所有记录,其中 userid 是我的 id..实际上我需要的是显示我朋友的所有活动..不是我的..
    • @Jenz 我想加入的查询应该可以按预期工作,因为您想要的结果集我还提供了另一个解决方案,请参阅我的更新答案
    【解决方案3】:

    尝试如下查询

    select * from useractivitylog a,requestfriend b,auth_user_profiles c 
       WHERE a.userid = b.userid and b.userid = c.userid;
    

    【讨论】:

      【解决方案4】:

      您可以从另一端转到您的数据... 首先选择你所有的朋友,如果你有他们,获取他们的数据:

      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'
      

      在你的 requestfriend 表中的反之亦然连接的其余部分应该没问题。

      由于好友请求不应像活动那么多,如果您有大量数据,这可能会带来更好的性能...

      【讨论】:

        【解决方案5】:

        您需要添加一个字段来加入您的第一个表:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-16
          • 1970-01-01
          • 2013-10-21
          • 1970-01-01
          • 1970-01-01
          • 2015-06-09
          • 2014-07-06
          • 1970-01-01
          相关资源
          最近更新 更多