2

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テーブルは、 CCompleteを表し、 PPendingを表すユーザー間の関係を示します。status = C両方が友達であり、status = Pリクエストが保留中の場合を意味します。

frei_sessionテーブルには、Webサイトのすべてのオンラインユーザーが表示されます。

友達とのチャットだけに制限したい。次のクエリを試しましたが、オンラインのすべてのユーザーが表示されます

ユーザー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は友達ではないため

4

5 に答える 5

4
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);
于 2013-03-09T10:13:18.340 に答える
2

なぜ同じテーブルを2回結合するのですか?

試す

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私があなたの問題を理解したなら、私は試みます、それはうまくいくかもしれません。

于 2013-03-09T10:02:36.110 に答える
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'
于 2013-03-09T10:08:33.593 に答える
0

まず、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"

この解決策は理解しやすいと思います。

于 2013-03-09T15:08:33.830 に答える
0
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)
于 2013-03-29T12:31:19.100 に答える