2014-10-10 2 views
0

Я уже сделать онлайн статус пользователя только для друзейMySQL: Пользователь Статус онлайн [HELP]

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 

Может кто-нибудь помочь мне достичь результата я хочу?


ОБНОВЛЕНИЕ

users стол

enter image description here

friends стол

enter image description here


Я хочу сделать что-то вроде этого результата

Интернет пользователь: Khrisna Gunanasurya // logined счета

Список друзей онлайн: Альфа, Джон // друзья онлайн из logined счета

Другой пользователь онлайн: Mark, Ralph // другой пользователь, который зарегистрировался, а не друг логин-аккаунта

+0

Просьба представить схему таблицы, выборочные данные и желаемый результат в табличной форме – peterm

+0

Добавлена table –

ответ

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); 

Вопросительный знак представляет значение идентификатор зарегистрированного пользователя (например, 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 предоставили какую-либо ценность там –

+0

Почему я получил предупреждает? 'Предупреждение: PDOStatement :: execute(): SQLSTATE [HY093]: Недопустимый номер параметра: никаких параметров не было связано –

+1

* Почему я получил это предупреждение? *. Это связано с тем, что перед выполнением запроса вы должны привязать значение идентификатора зарегистрированного пользователя. Не используйте интерполяцию строки запроса, как вы делали '... friend_one = '{$ id}' ...'. – peterm

Смежные вопросы