2017-02-02 1 views
1

Я пытаюсь создать общий запрос друзей. Но я не уверен, как объединить две таблицы, чтобы получить правильный результат.Запрос общих друзей

Так что если пользователь сеанса имеет общего друга со своим другом, общий друг - это один. То, что я ищу, - лучшее решение, самый быстрый и самый маленький запрос для выполнения этой работы.

стол пользователя

id | first | last | username 
---------------------------- 

друзей стол

id | user 1_id | user2_id | status 
---------------------------------- 

Покушение запрос

$collectmutualfriends = mysqli_query($mysqli," 
    SELECT 
       user.id, 
       user.first, 
       user.last, 
       user.username 
    FROM  user 
    LEFT JOIN friends as friends1 
      ON friends1.user1_id = user.id 
      AND friends1.user2_id = '$user2_id' 
      AND friends1.status = 2 

    LEFT JOIN friends as friends2 
      ON friends2.user2_id = user.id 
      AND friends2.user1_id = '$user2_id' 
      AND friends2.status = 2 

    GROUP BY friends2.user2_id 
    "); 
$nummutual = mysqli_num_rows($collectmutualfriends); 
if($nummutual==1){ 
    echo"<a href='mutualfriends.php?username=".$_GET['username']."'>".$nummutual." Mutual Friend<br></a>"; 
    }else if($nummutual>1){ 
    echo"<a href='mutualfriends.php?username=".$_GET['username']."'>".$nummutual." Mutual Friends<br></a>"; 
    } 

UPDATE

$user1_id = $_SESSION['id']; 
$user2_id = $data['id']; 

$ user1_id и $ user2_id могут быть в user1_id или user2_id в таблице друзей, в зависимости от того, кто первым отправил запрос другу.

+0

Вы можете разместить некоторые выборочные данные, а? –

+0

Когда 2 пользователя являются друзьями, у вас есть 1 или 2 строки в другом? –

+0

Что делают все остальные? – Strawberry

ответ

3

Это должно сделать трюк:

$sql = "SELECT u.* 
      FROM friends f1 
    INNER JOIN friends f2 ON (f2.user2_id = f1.user2_id) 
    INNER JOIN user u ON (u.id = f2.user2_id) 
     WHERE f1.user1_id = '$user1_id' 
      AND f2.user1_id = '$user2_id'"; 
+0

Как и мой запрос, он не показывает никаких результатов по всем профилям. Пользователь сеанса может находиться в строке user1_id или user2_id в таблице друзей, в зависимости от того, кто отправил запрос друга. Означает ли это, что такое когда-либо? – Gateway

+1

Я вижу это как недостаток вашего дизайна. Если пользователь A и пользователь B являются друзьями, также верно и обратное, пользователь B и пользователь A также являются друзьями. В этом случае вы можете легко выбрать всех друзей пользователя A или всех друзей пользователя B. Выполняя то, что вы делаете, вам придется дважды запрашивать базу данных, глядя на столбец user1_id и снова на столбец user2_id. Мой совет - сохранить две строки для каждой дружбы. –

+0

, так что если в user1_id у меня есть A, а user2_id у меня есть b .. есть еще одна строка с user1_id как B и user2_id как A, это то, что вы говорите? – Gateway

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