简体   繁体   English

MySQL选择查询不起作用

[英]MySQL Select query not working

I have 2 tables and I want to fetch users data from it. 我有2个表,我想从中获取用户数据。

Table 1 : frei_session 表1: frei_session

username    session_id

Prince      51
Dilip       49
Sumit       50

Table 2 : friendrequest 表2: friendrequest

requestTo   requestFrom     status

49              50              C
50              51              C
49              51              P

friendrequest table show relationship between users where C stands for Complete and P stands for Pending . friendrequest表显示用户之间的关系,其中C代表完成P代表待定 means if status = C both are friends and if status = P request is pending. 表示如果status = C都是朋友,并且status = P请求正在等待。

frei_session table display all online users of website. frei_session表显示网站的所有在线用户。

I want to limit chat with friends only. 我想限制与朋友聊天。 I have tried following query but it shows all users which are online 我尝试了以下查询,但它显示了所有在线用户

suppose user 49 is online 假设用户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')

This query show me output like this 这个查询显示我这样的输出

username    session_id

Prince          51
Sumit           50

but I want output like this 但我想要这样的输出

username    session_id

Sumit       50

because user 51 and user 49 are not friends 因为用户51和用户49不是朋友

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)

RESULT 结果

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

UPDATE 1 更新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 $$

when calling the procedure, 在调用程序时,

CALL ShowAllUserName(49);

Why do you join twice the same table ? 为什么你加入同一张桌子两次?

try 尝试

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

Than, you could change your where query by : 比,您可以通过以下方式更改您的查询位置:

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

I'd try GROUP BY fr.status if I did understand your problem, it may work. 如果我理解你的问题,我会尝试GROUP BY fr.status ,它可能会有效。

Try to use this query: 尝试使用此查询:

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'

You can first get the users who have received request from Dilip. 您可以先获得收到Dilip请求的用户。 You then get the users who have sent request to Dilip. 然后,您将获得向Dilip发送请求的用户。 After that you union these users. 之后,您将这些用户联合起来。 The SQL is something like: 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"

I believe that this solution is easier to understand. 我相信这个解决方案更容易理解。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM