За последние 24 часа нас посетили 57948 программистов и 1695 роботов. Сейчас ищут 892 программиста ...

Выбрать нужные данные

Тема в разделе "PHP и базы данных", создана пользователем FrenkProgrammer, 12 июл 2014.

  1. FrenkProgrammer

    FrenkProgrammer Новичок

    С нами с:
    12 июл 2014
    Сообщения:
    66
    Симпатии:
    0
    Есть таблица users и friends

    users
    - id (int) 10 auto_increment
    - login (varchar) 50
    - password (varchar) 35
    1, Frenk, password
    2, Richard, password
    9, James, password
    10, Alex, password

    friends
    - friend_id (int) auto_increment
    - user1 (int) 10
    - user2 (int) 10
    1, 1, 10 -> users -> id 10 -> login Alex
    2, 1, 9 -> users -> id 9 -> login James
    3, 2, 1 -> users -> id 2 -> login Richard
    4, 2, 9
    5, 9, 10

    нужно достать данные где присутствует мой id, по этому вытащить из users айдишник и логин, только противоположного пользователя.

    <a href="/?profile=10">Alex</a><br />
    <a href="/?profile=9">James</a><br />
    <a href="/?profile=2">Richard</a><br />
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Взаимоисключающие параграфы в треде!!111

    Кто такой, кстати, противоположный пользователь?
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    типА id: 1, login: Саша(мужик) | id: 1, login: Саша(женщина)
    хд)))
     
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    LEFT JOIN поможет найти друзей пользователя с id = 1
     
  5. FrenkProgrammer

    FrenkProgrammer Новичок

    С нами с:
    12 июл 2014
    Сообщения:
    66
    Симпатии:
    0
    Удалено!
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    как именно с джойном не получается?
     
  7. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Во-первых, непонятно, у вас "дружба" - отношение реверсивное или нет? Т.е. если Алекс друг Фрэнка, то Френк друг Алекса или нет?
    Если нет - все просто, вот список всех друзей Фрэнка:
    select users.login
    from friends left join users on friends.user2=users.id
    where friends.user1 = 1
     
  8. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Вы предложили очень неоптимальный вариант - сначала вытащить все строки, где упоминается нужный user_id, а потом для каждой дергать базу еще раз. Ответьте на вопрос из моего прошлого поста. Я вот не понимаю, если user1 = 1 и user2 = 2, это означает то же самое, что user1=2 и user2=1? Кстати, поле friend_id в таблице не нужно.
    В любом случае там можно все сделать одним запросом, без цикла.
     
  9. FrenkProgrammer

    FrenkProgrammer Новичок

    С нами с:
    12 июл 2014
    Сообщения:
    66
    Симпатии:
    0
    Да это так.
     
  10. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Тогда где-нибудь так:
    Код (Text):
    1.  
    2. select distinct t.id, u.login
    3. from (
    4.    select user2 id from friends where user1=$id
    5.    union all
    6.    select user1 id from friends where user2=$id
    7. ) t left join users u
    8.     on u.id=t.id
     
  11. applicab

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

    С нами с:
    14 июл 2014
    Сообщения:
    73
    Симпатии:
    18
  12. FrenkProgrammer

    FrenkProgrammer Новичок

    С нами с:
    12 июл 2014
    Сообщения:
    66
    Симпатии:
    0
    Вроди как все правельно работает, спасибо, можете еще расписать как этот запрос работает, я просто пока таких запросов не делал хотелось бы понять.
     
  13. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Внутренний запрос объединяет в себе два отдельных запроса: "выбрать всех пользователей, которые дружат с $id" и "выбрать всех пользователей, с которыми дружит $id". Получаем idшники всех друзей нужного человека (возможно, с повторами, я не знаю, как у вас организовано добавление друга). Потом к этой таблице прицепляем таблицу users и берем для каждого id соответствующее имя пользователя. Ну, и используем distinct, чтобы не получать повторы.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Чтобы понять, как работает join, надо один раз реализовать его руками. Взять выборку из двух таблиц и сделать декартово перемножение на том же пыхе, через циклы обычные. Придет понимание не только принципа работы join-а, но и то, почему их несколько видов.
     
  15. FrenkProgrammer

    FrenkProgrammer Новичок

    С нами с:
    12 июл 2014
    Сообщения:
    66
    Симпатии:
    0
    Спасибо