【问题标题】:Join 3 tables of users, friends, chats加入 3 个用户、朋友、聊天表
【发布时间】:2013-12-23 21:50:08
【问题描述】:

我只想获取单个用户好友的结果以及每个好友加入用户和好友聊天的最后一个时间戳:

用户好友列表:

  • Friend1:fname、lname、....、聊天时间戳

  • Friend2:fname、lname、....、聊天时间戳

  • ...

users表为主用户信息表:

usr_id,usr_fname,usr_lname

friends table 是一个包含友谊的表格:

frd_id、frd_usr_id1、frd_usr_id2

chats table 是一个包含用户之间聊天的表格:

cht_id, cht_usr_id1,cht_usr_id2,cht_timestamp

谁能帮我处理 SQL 语句?

假设请求用户 ID 在 $user_id 变量中

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    试试这个,它应该可以工作......

    SELECT u1.usr_fname [Friend1First], 
        u1.usr_lname [Friend1Last], 
        u2.usr_fname [Friend2First], 
        u2.usr_lname [Friend2Last], 
        MAX(ch.cht_timestamp) [LastChatTime]
    FROM Chats ch
        JOIN users u1 ON ch.cht_usr_id1 = u1.usr_id
        JOIN users u2 ON ch.cht_usr_id2 = u2.usr_id
    WHERE EXISTS (SELECT frd_id from friends fs WHERE (fs.frd_usr_id1 = a.usr_id AND fs.frd_usr_id2 = b.usr_id) 
                        OR (fs.frd_usr_id2 = a.usr_id AND fs.frd_usr_id1 = b.usr_id))
    GROUP BY u1.usr_fname, u1.usr_lname, u2.usr_fname, u2.usr_lname,
    

    【讨论】:

      【解决方案2】:

      这就是答案:

      SELECT f.frd_id, u.usr_id, u.usr_fname, u.usr_lname, MAX(c.cht_timestamp)
      FROM friends AS f
      LEFT JOIN users AS u ON u.usr_id IN (
      SELECT u1.usr_id FROM users AS u1 WHERE u1.usr_id != $user_id)
      LEFT JOIN chats AS c ON ( (c.cht_usr_id1=$user_id AND c.cht_usr_id2=u.usr_id) OR
            (c.cht_usr_id1=u.usr_id AND c.cht_usr_id2=$user_id) )
          WHERE ( (f.frd_usr_id1=$user_id AND f.frd_usr_id2=u.usr_id) OR
          (f.frd_usr_id1=u.usr_id AND f.frd_usr_id2=$user_id) )
          GROUP BY u.usr_id ORDER BY  MAX(c.cht_timestamp) DESC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多