Перечисление всех друзей и присоединение к таблице пользователей - PullRequest
3 голосов
/ 21 февраля 2011

У меня есть база данных с именем friends и столбцы user_id и friend_id. user_id - приглашающий, а friend_id - получатель. Обратите внимание, что когда создается дружба, я НЕ делаю 2 записи в базе данных, как 1,2 и 2,1.

Как составить список всех моих друзей, учитывая, что мой users.user_id может варьироваться между friends.friend_id и friends.user_id в таблице 'friends'. Также, как присоединить запрос к таблице 'users', чтобы получить имена всех моих друзей.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Одним из вариантов будет объединение двух запросов:

select u.name
    from friends f
        inner join users u
            on f.user_id = u.user_id
    where f.friend_id = @YourID
union
select u.name
    from friends f
        inner join users u
            on f.friend_id = u.user_id
    where f.user_id = @YourID
2 голосов
/ 21 февраля 2011

Вы должны сделать запрос Join , чтобы получить максимальную производительность.Попробуйте что-то вроде этого:

$friends_result = mysql_query("
    SELECT
        users.`name` AS name
    FROM
        friends
    LEFT JOIN
        users
    ON
        users.`id` = friends.`user_id`
    OR
        users.`id` = friends.`friend_id`
    AND
        users.`id` != '" . $user_id . "'
    WHERE
        friends.`user_id` = '" . $user_id . "'
    OR
        friends.`friend_id` = '" . $user_id . "'");

echo "<strong>My friends:</strong><br />";

while($friends_array = mysql_fetch_array($friends_result))
{
    echo $friends_array['name'] . "<br />";
}
0 голосов
/ 21 февраля 2011

Я думаю, что было бы проще всего убедиться, что таблица friends всегда имеет более низкий идентификатор в столбце user_id и более высокий в другом.
Таким образом, вам не нужно проверять дважды, что обеспечивает лучшую производительность.

Однако этот подход требует, чтобы вы изменили код добавления друзей, и предполагает, что идентификаторы пользователей никогда не меняются (или вы должны обновить свои идентификаторы в таблице).

В противном случае используйте UNION запросы, как сказал Джо, или присоединитесь, используя условие OR (например, JOIN ... ON u.user_id = friends.user_id OR u.user_id = friends.friend_id) или IN (JOIN ... ON u.user_id IN (friends.user_id, friends.friend_id)), что может быть дорогостоящим процессом (используйте EXPLAIN и тесты выяснить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...