За последние 24 часа нас посетили 27843 программиста и 1815 роботов. Сейчас ищут 1111 программистов ...

реализация списка общих друзей

Тема в разделе "MySQL", создана пользователем aswind, 7 окт 2009.

  1. aswind

    aswind Активный пользователь

    С нами с:
    5 окт 2009
    Сообщения:
    27
    Симпатии:
    0
    Всем привет!
    Возникла очередная проблема: не доходит до меня какой запрос в базу выдаст список общих друзей у двух узеров.
    Есть таблица users и friends. friends связывает юзеров по id. Если есть запись где first=1 and second=2 то юзеры 1 и 2 — друзья. на самом деле там еще дофига свойств типа запросов на дружбу, отказов и т п, но это не важно.
    ВКонтакте и многих других крупных социальных сетях есть такая вещь как «общие друзья». Пример. U1 дружит с U2 и U3. U3 дружит с U2. Когда U1 заходит на страницу U2, то он должен увидеть в списке общих друзей U3. Вопрос: как это сделать? Очень рассчитываю на помощь и жду :)
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [sql]SELECT first, second FROM friends WHERE first IN (id1, id2) // выбираем всех друзей имеющихся у id1 и id2
    GROUP BY second
    HAVING count(second) > 1 // выводим только тех друзей которые встречаются больше 1го раза (т.е. есть у обоих)[/sql]
     
  3. aswind

    aswind Активный пользователь

    С нами с:
    5 окт 2009
    Сообщения:
    27
    Симпатии:
    0
    Simpliest Ооо, спасибо! Думаю это то, что мне надо! Завтра проверю, щас мозг уже спит :))
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    что-то у меня большие сомнения что этот вариант быстр.
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    и у тебя на одну дружбу две записи или одна? то есть искать дружбу а и б можно только в id1=A and id2=B или добавлять or id1=B and id2=A
     
  6. aswind

    aswind Активный пользователь

    С нами с:
    5 окт 2009
    Сообщения:
    27
    Симпатии:
    0
    armadillo
    на дружбу запись одна.
    а какие другие варианты побстрее?
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    потом гляну.

    просто from friends f1
    join friends f2 ON f2.id2=f1.id2 не подойдет?


    но если запись одна то нужно обрабатывать все варианты - когда нужный ид и справа и слева.
     
  8. aswind

    aswind Активный пользователь

    С нами с:
    5 окт 2009
    Сообщения:
    27
    Симпатии:
    0
    В принципе, я уже подумываю о том, чтоб делать две записи. Терять, вроде, нечего.
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Кхм, очередной спичечник?

    Он более чем достаточно быстр :)
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Не мучайся и делай. Друг всегда во 2м поле. Этим ты упростишь логику приложения

    У тебя не будет миллионов пользователей. Выборка идет исключительно по полям с индексом.

    Самое тяжелое в запросе это HAVING на конечный результат, который будет в пределах 1-2к записей (можешь взять статистику по среднему количеству друзей с mail.ru, vkontakte.ru).
    Ну а пользователей с 100к друзей, я думаю ты будешь отстреливать сам.

    Так что все будет очень быстро.