【问题标题】:MySQL - Complex query issue, multiple tablesMySQL - 复杂查询问题,多个表
【发布时间】:2012-02-08 10:42:19
【问题描述】:

我在找出需要编写的 SQL 语句时遇到了一些麻烦。

我有两张桌子

朋友

===================================
friendfromid | friendtoid | request
===================================

用户

=================
userid | username
=================

我需要获取我朋友的每个用户的用户 ID 和用户名。

我的 id 是在friendfromid 还是friendtoid 中,这取决于我是被用户请求还是用户请求我。

所以基本上需要发生的是脚本需要查看friends表,获取我的id是friendfromid或friendtoid的所有行检查请求字段是否设置为1,获取所有适合匹配的行然后获取不属于我的每个friendfromid 或friendtoid 的ID 和用户名。

例如,如果我的 id 是 8,而朋友的 id 是 9,假设他们要求我他们的 id 将在friendfromid 字段中,而我的 id 将在friendtoid 字段中,这意味着脚本将采用他们的 id ( 9) 并将其与 users 表中的该用户匹配。

【问题讨论】:

    标签: php mysql sql select join


    【解决方案1】:

    这将提供带有朋友 ID 和朋友姓名的朋友列表:

    SELECT  u.userid , u.username
    FROM Friends f 
    JOIN Users u 
    ON (( f.friendfromid ={the ID} AND friendtoid=u.userid)
    OR ( f.friendtoid = {the ID}  AND friendfromid=u.userid))
    WHERE f.request = 1
    

    将{ID}=需要好友列表的用户ID。

    【讨论】:

    • 我想你的意思是(friendfromid=? AND friendtoid=userid) OR (friendtoid=? AND friendfromid=userid)
    • 我的意思是当fromid匹配toid是外键,反之亦然。你的整个加入条件相当于{the ID} = userid!
    • @SomnathMuluk:我不得不删除双等号,但是它完美无缺,谢谢
    • 对不起,伙计……我错误地做了双等号……我已经删除了双等号并现在放置了单等号。
    【解决方案2】:

    应该是这样的:

    SELECT * 
    FROM users 
    JOIN friends 
    ON friendfromid != userid
    OR friendtoid != userid
    WHERE request = 1
      AND userid = {the ID}
    

    【讨论】:

    • 不正确。他想从 friendfromidfriendtoid 获取 ID,其中他的用户 ID 在相反的字段中。
    【解决方案3】:

    无法在 1 个查询中实现。

    friendfromid 字段中获取带有“我的用户ID”的friendtoid

    SELECT b.friendtoid FROM Users a, Friends b WHERE request=1 AND friendfromid = a.userid
    

    friendfromid 反之亦然。

    【讨论】:

    • 对不起,这没有任何意义....我需要从用户表中获取用户 ID 和用户名
    【解决方案4】:

    使用 UNION 查询,加入以下好友

    SELECT username FROM user INNER JOIN friends ON (userid = friendfrom) WHERE friendto = {myid) AND request = 1
    UNION
    SELECT username FROM user INNER JOIN friends ON (userid = friendto) WHERE friendfrom = {myid} AND request = 1
    

    请记住,您需要在friendto 和friendfrom 列上建立索引以提高性能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多