[英]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)
friendrequest
has status of C
) SQLFiddle演示( 当所有的friendrequest
具有的地位C
) 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.