2014-10-10 47 views
0

我已經做了朋友的唯一MySQL的:用戶在線狀態[求助]

SELECT * FROM users 
WHERE 
    (id_user IN 
     (SELECT CASE 
      WHEN friend_one = '{$id}' 
       THEN friend_two 
      WHEN friend_two = '{$id}' 
       THEN friend_one 
      END 
     FROM friends 
     WHERE status = '1') 
    ) AND (status = '1' OR ($date - last_login) <= 300) 

而且它的工作原理用戶的在線狀態,這MySQL只顯示好友登錄狀態列表。

但問題是,當我嘗試使另一個用戶登錄狀態,只顯示另一個人登錄,但沒有在我們的朋友列表中的列表。

SELECT * FROM users 
WHERE 
    (id_user NOT IN 
     (SELECT CASE 
      WHEN friend_one = '{$id}' 
       THEN friend_two 
      WHEN friend_two = '{$id}' 
       THEN friend_one 
      END 
     FROM friends 
     WHERE status = '1') 
    ) AND (status = '1' OR ($date - last_login) <= 300) 

所以這是結果,我想

Logged as: khrisna 
Friend list: Ben, Alpha, Ralph 
All User: Ben, Alpha, John, Mark, Zayn 

Online friend list: Ben, Alpha 

Another online user: John, Mark, Zayn 

有人可以幫助我達到我想要的結果呢?


UPDATE

users

enter image description here

friends

enter image description here


我想要像這樣的結果

在線用戶:Khrisna Gunanasurya // logined佔

好友列表在線:阿爾法,約翰logined帳戶

的//在線好友

其他用戶在線:馬克,拉爾夫//其他用戶登錄並且不是登錄帳戶的朋友

+0

請提供表模式,樣本數據和期望的結果以表格形式 – peterm 2014-10-11 03:18:01

+0

添加了表 – 2014-10-11 03:21:56

回答

1

一種方法:

獲取通過在線

SELECT * 
    FROM 
(
    SELECT CASE WHEN friend_one = ? THEN friend_two ELSE friend_one END friend 
    FROM friends 
    WHERE ? IN(friend_one, friend_two) 
    AND status = 1 
) f JOIN users u 
    ON f.friend = u.id_user 
WHERE status = 1 OR last_login >= UNIX_TIMESTAMP() - 300; 

獲取所有非朋友是網上

SELECT * 
    FROM users u 
WHERE id_user <> ? 
    AND NOT EXISTS 
(
    SELECT * 
    FROM friends 
    WHERE ? IN(friend_one, friend_two) 
    AND status = 1 
    AND u.id_user = CASE WHEN friend_one = ? THEN friend_two ELSE friend_one END 
) 
    AND (status = 1 OR last_login >= UNIX_TIMESTAMP() - 300); 

問號代表的ID的值的登錄用戶的所有好友(例如Khrisna Gunanasurya)

這裏是SQLFiddle演示


你的PHP代碼可能看起來像

$sql = "SELECT * 
    FROM 
(
    SELECT CASE WHEN friend_one = ? THEN friend_two ELSE friend_one END friend 
    FROM friends 
    WHERE ? IN(friend_one, friend_two) 
    AND status = 1 
) f JOIN users u 
    ON f.friend = u.id_user 
WHERE status = 1 OR last_login >= UNIX_TIMESTAMP() - 300"; 

$stmt = $pdo->prepare($sql); 
$stmt->execute(array_fill(0, 2, $id)); 
+0

然後將會是什麼值,即給出的問號?? ..你havnt提供任何值 – 2014-10-11 04:00:34

+0

爲什麼我得到是警告? '警告:PDOStatement :: execute():SQLSTATE [HY093]:無效的參數編號:沒有參數被綁定' – 2014-10-11 04:02:56

+1

*爲什麼我得到這個警告?*。這是因爲在執行查詢之前,您需要綁定登錄用戶的ID的值。不要像使用'... friend_one ='{$ id}'...'那樣使用查詢字符串插值。 – peterm 2014-10-11 04:06:18