【问题标题】:MySQL Select query not workingMySQL选择查询不起作用
【发布时间】:2013-03-09 09:57:54
【问题描述】:

我有 2 个表,我想从中获取用户数据。

表 1: frei_session

username    session_id

Prince      51
Dilip       49
Sumit       50

表 2: friendrequest

requestTo   requestFrom     status

49              50              C
50              51              C
49              51              P

friendrequest 表显示用户之间的关系,其中 C 代表 CompleteP 代表 Pending 。表示status = C 是否都是朋友,如果status = P 请求处于待处理状态。

frei_session表格显示网站的所有在线用户。

我只想限制与朋友的聊天。我尝试了以下查询,但它显示了所有在线用户

假设用户 49 在线

SELECT DISTINCT f.username,f.session_id
    FROM frei_session AS f
    LEFT JOIN friendrequest AS fr ON fr.requestFrom=f.session_id
    LEFT JOIN friendrequest AS frnd ON frnd.requestTo=f.session_id
    WHERE (fr.requestFrom<>49 OR frnd.requestTo<>49) AND (fr.status = 'C' OR frnd.status = 'C')

这个查询显示这样的输出

username    session_id

Prince          51
Sumit           50

但我想要这样的输出

username    session_id

Sumit       50

因为用户 51 和用户 49 不是朋友

【问题讨论】:

    标签: mysql sql select join


    【解决方案1】:
    SELECT  IF(a.RequestTo = 49, c.userName, b.userName) username,
            IF(a.RequestTo = 49, c.session_ID, b.session_ID) Session_ID
    FROM    friendRequest a
            INNER JOIN frei_session b
                ON a.requestTo = b.session_ID
            INNER JOIN frei_session c
                ON a.requestFrom = c.session_ID
    WHERE   a.status = 'C' AND
            49 IN (a.requestTo, a.requestFrom)
    

    结果

    ╔══════════╦════════════╗
    ║ USERNAME ║ SESSION_ID ║
    ╠══════════╬════════════╣
    ║ Sumit    ║         50 ║
    ╚══════════╩════════════╝
    

    更新 1

    DELIMITER $$
    CREATE PROCEDURE ShowAllUserName(IN _sessionID INT)
    BEGIN
        SELECT  IF(a.RequestTo = _sessionID, c.userName, b.userName) username,
                IF(a.RequestTo = _sessionID, c.session_ID, b.session_ID) Session_ID
        FROM    friendRequest a
                INNER JOIN frei_session b
                    ON a.requestTo = b.session_ID
                INNER JOIN frei_session c
                    ON a.requestFrom = c.session_ID
        WHERE   a.status = 'C' AND
                _sessionID IN (a.requestTo, a.requestFrom);
    END;
    DELIMITER $$
    

    调用过程时,

    CALL ShowAllUserName(49);
    

    【讨论】:

    • 很棒的 JW。它的工作就像一个魅力,你是优秀的。非常感谢
    • 你想让我把它转换成stored procedure吗?
    • 您能告诉我您如何以这种表格格式将您的输出制成表格吗?
    【解决方案2】:

    尝试使用这个查询:

    SELECT DISTINCT f.username,f.session_id
    FROM frei_session AS f
    LEFT JOIN friendrequest AS fr ON f.session_id IN (fr.requestFrom, fr.requestTo)
    WHERE fr.requestFrom = 49 AND fr.status = 'C'
    

    【讨论】:

      【解决方案3】:

      你为什么要加入同一张桌子两次?

      试试

      LEFT JOIN friendrequest AS fr ON fr.requestFrom=f.session_id AND fr.requestTo=f.session_id
      

      然后,您可以通过以下方式更改您的 where 查询:

      WHERE fr.requestFrom<>49 AND fr.status = 'C'
      

      如果我确实了解您的问题,我会尝试GROUP BY fr.status,它可能会起作用。

      【讨论】:

        【解决方案4】:

        您可以先获取收到Dilip请求的用户。然后,您将获取已向 Dilip 发送请求的用户。之后,您联合这些用户。 SQL 类似于:

        SELECT fs.username, fs.session_id
        FROM   frei_session AS fs, friendrequest AS fr
        WHERE  fs.username = "Dilip"
          AND  fs.session_id = fr.requestFrom
          AND  fr.status = "C"
        UNION
        SELECT fs.username, fs.session_id
        FROM   frei_session AS fs, friendrequest AS fr
        WHERE  fs.username = "Dilip"
          AND  fs.session_id = fr.requestTo
          AND  fr.status = "C"
        

        我相信这个解决方案更容易理解。

        【讨论】:

          【解决方案5】:
          SELECT  IF(a.RequestTo = 49, c.userName, b.userName) username,
                  IF(a.RequestTo = 49, c.session_ID, b.session_ID) Session_ID
          FROM    friendRequest a
                  INNER JOIN frei_session b
                      ON a.requestTo = b.session_ID
                  INNER JOIN frei_session c
          
                      ON a.requestFrom = c.session_ID
          WHERE   a.status = 'C' AND
                  49 IN (a.requestTo, a.requestFrom)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-11
            • 2010-11-09
            相关资源
            最近更新 更多