Нужна помощь по написанию списка рекомендаций друзей

DarksLight2

Знаток
⚖️
📜
Здравствуйте, как можно сделать вывод рекомендаций друзей, который основан на друзьях друзей?
Вот пример того, что мне нужно
Screenshot 2019-06-07 14.56.25.png
 

oxy

Продвинутый
🏆
📜
💎
  • Надмозг
Смысл примерно такой

1) Создаешь базу друзей userId, friendId (мой ид, твой ид)
2) Берешь всех друзей друзей SELECT userID, count(*) FROM friends WHERE userID IN (тут массив ID всех твоих друзей (friendId)) GROUP BY userId <- вот тут правда не соображу группировать надо по userId или friendId. Таблицу впадлу делать и проверять, а башка плохо работает с похмелья)))
 

DarksLight2

Знаток
⚖️
📜
У меня получилось что-то типа:

PHP:
                    $query = $mysqli->query("SELECT * FROM `friends` WHERE `accountID` = '".$user['id']."' OR `friendID` = '".$user['id']."'");
                    $friends = $query->fetch_array();
                    $friendsFriends =  $mysqli->query("SELECT `accountID` , count(*)  FROM `friends` WHERE `accountID` IN ('".$friends['friendID']."') GROUP BY `accountID`");
                    while($row = $friendsFriends->fetch_array()){
                        $query = $mysqli->query("SELECT * FROM `accounts` WHERE `id` = '".$row['accountID']."'");
                        $suggestions = $query->fetch_array();
Выводит моего друга, что не так?
 
Последнее редактирование:

oxy

Продвинутый
🏆
📜
💎
  • Надмозг
Ты в первом запросе получаешь массив друзей
[0] => ['id'=>1, 'login'=>'huilo' ... и так далее
А во второй запрос прилетает уже ошибка. Тебе нужно получить только ид друзей и сделать implode что бы запрос выглядел в итоге вот так:
SELECT `accountID` , count(*) FROM `friends` WHERE `accountID` IN (1,3454,666,900) GROUP BY `accountID`
 

DarksLight2

Знаток
⚖️
📜
Окей, спасибо, получилось, но теперь если можешь помоги мне с еще одной проблемой.
Я планирую сделать добавление в друзья таким образом, что человек который добавляется будет заноситься в `accountID` , а человек к которому я хочу добавиться в
`friendID`. Если допустим поставить мой ид в `friendID`, а ид друга в `accountID` то по идеи работать не будет. Как это все сделать?
 

DarksLight2

Знаток
⚖️
📜
Вот код который получился, вдруг кому пригодиться

PHP:
                <?
                    $query = $mysqli->query("SELECT `friendID` FROM `friends` WHERE `accountID` = '".$user['id']."' OR `friendID` = '".$user['id']."'");
                    $friends = $query->fetch_array();
                    $f = implode(",", $friends);
                    $friendsFriends = $mysqli->query("SELECT `friendID` FROM `friends` WHERE `accountID` IN (".$f.") GROUP BY `friendID` LIMIT 4");
                    while($row = $friendsFriends->fetch_array()){
                        $query = $mysqli->query("SELECT * FROM `accounts` WHERE `id` = '".$row['friendID']."'");
                        $suggestions = $query->fetch_array();
                        $_count = $mysqli->query("SELECT count(*) FROM `friends` WHERE `friendID` = '".$friends['friendID']."'");
                        $count = $_count->num_rows;
                        $__friends = "общих друзей";
                        if($count == 1)
                            $__friends = "общий друг";
                        else if($count > 1 AND $count < 5)
                            $__friends = "общих друга";
                ?>
                    <li class="inline-items">
                        <div class="author-thumb">
                            <img width="36px" src="img/<?=$suggestions['avatar']?>" alt="author">
                        </div>
                        <div class="notification-event">
                            <a href="/profile/<?=$suggestions['id']?>" class="h6 notification-friend"><?=$suggestions['firstName']?> <?=$suggestions['lastName']?></a>
                            <span class="chat-message-item"><?=$count?> <?=$__friends?></span>
                        </div>
                        <span class="notification-icon">
                            <a href="/profile/<?=$suggestions['id']?>/reaqestFriend/" class="accept-request">
                                <span class="icon-add without-text">
                                    <svg class="olymp-happy-face-icon"><use xlink:href="icons/icons.svg#olymp-happy-face-icon"></use></svg>
                                </span>
                            </a>
                        </span>

                    </li>
                    <?
                    }
                    ?>
 
Последнее редактирование:

Insallah

Специалист
👑
⚖️
🏆
📜
💎
  • Золотая медаль
<a href="/profile/<?=$suggestions['id']?>/reaqestFriend/" class="accept-request">
Называть для удобства лучше всё таки единообразно reaqest≠request :)

Упрощай:
PHP:
<?php
# ...
    $count = $_count->num_rows;
    $__friends = "общих друзей";
    if($count == 1)
        $__friends = "общий друг";
    else if($count > 1 AND $count < 5)
        $__friends = "общих друга";
?>
    ...
    <span class="chat-message-item"><?=$count?> <?=$__friends?></span>
    ...
PHP:
<?php
# Минус одна переменная. И в HTML только одно значение, а не два.
    $__friends = $_count->num_rows." общих друзей";
    if($_count->num_rows == 1)
        $__friends = $_count->num_rows." общий друг";
    else if($_count->num_rows > 1 AND $_count->num_rows < 5)
        $__friends = $_count->num_rows." общих друга";
?>
    ...
    <span class="chat-message-item"><?= $__friends ?></span>
    ...
Запрос плохой:
SQL:
SELECT `friendID` FROM `friends` WHERE `accountID` = '".$user['id']."' OR `friendID` = '".$user['id']."
Почему? Потому что вторым условием просишь: покажи мне friendID в строчках, где friendID = $user['id']. То есть ты сразу можешь сказать, что $query = $user['id'] и не выполнять лишний запрос в базу.

Вообще расскажи на пальцах свой алгоритм. Я нутром чую, что ты перекрутил и усложнил, но, так как хрен пойми что именно ты отдаёшь на экран…
 

DarksLight2

Знаток
⚖️
📜
Ну вот смотри, я добавляюсь к тебе в друзья, мой ид заниситься в ячейку accountID, твой ид заноситься в ячейку friendID.
Таким образом у меня будут работать рекомендации друзей, а у тебя нет, так как твой ид не состоит в ячейке accountID.
Я вот думаю, если при подаче заявки в друзья отправлять в базу не один запрос где мой ид в accountID, а твой в friendID, а два запроса, так как говорил высше и где уже твой ид accountID, а мой friendID.

Но жопой чую где-то будет подвох.
Замечания увидел, уже исправляю
 

Insallah

Специалист
👑
⚖️
🏆
📜
💎
  • Золотая медаль
А добавление в друзья — двухсторонний процесс, или это односторонняя подписка?
Ну то есть как. Вы оба добавились и теперь читаете рекомендации друг друга. А если человек не хочет читать рекомендации от тебя? А если ты его добавил, а он те6я не хочет добавлять? Что тогда?
 

DarksLight2

Знаток
⚖️
📜
Двухсторонний процесс, один человек должен подтвердить дружбу, без подтверждения человек не будет получать рекомендации или новости
 

Insallah

Специалист
👑
⚖️
🏆
📜
💎
  • Золотая медаль
Пока писал ответ, чуть не повторил совет @oxy почти слово в слово. :)
 

oxy

Продвинутый
🏆
📜
💎
  • Надмозг
Окей, спасибо, получилось, но теперь если можешь помоги мне с еще одной проблемой.
Я планирую сделать добавление в друзья таким образом, что человек который добавляется будет заноситься в `accountID` , а человек к которому я хочу добавиться в
`friendID`. Если допустим поставить мой ид в `friendID`, а ид друга в `accountID` то по идеи работать не будет. Как это все сделать?
Я бы вынес это в отдельную табу friendsInvites что бы разграничить все. В итоге после подтверждения дружбы в табу friends заносится запись. Это позволит оставить логику простой и понятной
 

oxy

Продвинутый
🏆
📜
💎
  • Надмозг
И если ты не против пару замечаний по коду:
1)
PHP:
while($row = $friendsFriends->fetch_array()){
                        $query = $mysqli->query("SELECT * FROM `accounts` WHERE `id` = '".$row['friendID']."'");
    ...
    }
Вот тут мне не нравится что БД дергается по каждому юзеру. Я бы сделал одним запросом получение всех. Ну типа

PHP:
$friendsArray = [];

while($friends = $friendsOfFriends->fetch_array()){
    $friendsArray[] = $friends['friendID'];
}

if(!empty($friendsArray)){
    $suggestionsQuery = $mysqli->query("SELECT * FROM `accounts` WHERE `id` = IN  (".implode(',', $friendsArray).") ");
    $suggestions = [];
   
    while($row = $suggestionsQuery->fetch_array()){
        $suggestions[$row['id']] = $row;
    }

    //.... ну и так далее...

    foreach ($suggestions as $suggestion){
        //И тут уже вставляешь все что тебе нужно. да это чуть усложняет код, но или ты делаешь 1 запрос и получаешь 5 или 5 запросов по одному к БД...
    }
}
2) Именуй переменные понятно $__friends чем отличается от $friends?
3) Старайся уходить от сокращенного синтаксиса, это потом тебе же очень сложно читать будет. Старайся кодить по PSR-4


Если что не понял, пиши не стесняйся, я разъясню.
 

DarksLight2

Знаток
⚖️
📜
Я бы вынес это в отдельную табу friendsInvites что бы разграничить все. В итоге после подтверждения дружбы в табу friends заносится запись. Это позволит оставить логику простой и понятной
Для меня не очень понятной, можешь подробней рассказать об этом, если конечно не сложно. Как это все реализовать?
 

Insallah

Специалист
👑
⚖️
🏆
📜
💎
  • Золотая медаль
Чел 1 приглашает Чел 2. Запись в таблицу friendsInvites.
У Чел 2 в профиле проверка: если мой логин есть в таблице friendsInvites, вывести мне списком логины тех, кто наприглашал.
Если Чел 2 отказывается — строка из friendsInvites удаляется. Если соглашается — строка удаляется, но пишется новая строка в Friends.
 
Внимание! Эта тема устарела на 117 дней.
Тут обсуждать нечего, лучше создай новую тему. Конечно, если очень-очень нужно (например хочешь ответить на древний вопрос), то отвечай. Но помни: некропост — зло, а модератор не дремлет!
Сверху