За последние 24 часа нас посетили 16576 программистов и 1650 роботов. Сейчас ищут 2018 программистов ...

Тройное объединение двух таблиц

Тема в разделе "MySQL", создана пользователем Danilka, 5 июн 2008.

  1. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Подскажите, как написать запрос, никак в голову не идёт.
    Есть две таблицы:

    1 [data] :
    id
    uid - юзер айди
    mid - менеджер айди
    data

    2 [usr] :
    id
    name

    Нужно выбрать все записи из data и присоеденить туда имена юзера и менеджера, а они оба в одной таблице. Как это сделать, подскажите пожалуйста.
    Должно быть типа:
    id uid uname mid mname data
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А где mname?
     
  3. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Ну типа MNAME это NAME из таблицы USR для ID совпадающего с MID
    а UNAME тоже самое, только для UID
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Условия выборки какие? Должны ли в результате выборке присутствовать поля без значения uname/mname?

    В общем смотри, есть такие варианты:
    Таблица:
    [sql]
    mysql> SELECT * FROM `data`;
    +----+-----+-----+------+
    | id | uid | mid | date |
    +----+-----+-----+------+
    | 1 | 1 | 2 | |
    | 2 | 3 | 4 | |
    +----+-----+-----+------+
    2 rows in set (0.01 sec)

    mysql> SELECT * FROM `usr`;
    +----+------------------+
    | id | name |
    +----+------------------+
    | 1 | Patrick Krolikov |
    | 2 | David Blane |
    | 3 | Will Smith |
    | 4 | Karina Barbi |
    | 5 | Carl Johnson |
    +----+------------------+
    5 rows in set (0.00 sec)
    [/sql]

    Запросы:
    1. Тип получаем отдельно mUsr, uUsr, только при их существовании:
    [sql]
    mysql> SELECT `data`.*, `usr`.* FROM `data`, `usr` WHERE `usr`.`id`=`data`.`uid` OR `usr`.`id`=`data`.`mid`;
    +----+-----+-----+------+----+------------------+
    | id | uid | mid | date | id | name |
    +----+-----+-----+------+----+------------------+
    | 1 | 1 | 2 | | 1 | Patrick Krolikov |
    | 1 | 1 | 2 | | 2 | David Blane |
    | 2 | 3 | 4 | | 3 | Will Smith |
    | 2 | 3 | 4 | | 4 | Karina Barbi |
    +----+-----+-----+------+----+------------------+
    4 rows in set (0.00 sec)
    [/sql]
    2. Получаем строки с mUsr & uUsr, только при их существовании
    [sql]
    mysql> SELECT `data`.*, `uusr`.*, `musr`.* FROM `data`, `usr` as `musr`, `usr` as `uusr` WHERE `uusr`.`id`=`data`.`uid` AND `musr`.`id`=`data`.`mid`;
    +----+-----+-----+------+----+------------------+----+--------------+
    | id | uid | mid | date | id | name | id | name |
    +----+-----+-----+------+----+------------------+----+--------------+
    | 1 | 1 | 2 | | 1 | Patrick Krolikov | 2 | David Blane |
    | 2 | 3 | 4 | | 3 | Will Smith | 4 | Karina Barbi |
    +----+-----+-----+------+----+------------------+----+--------------+
    2 rows in set (0.00 sec)
    [/sql]

    3. Вариант, когда uUsr || mUsr может не существовать (для этого удалил из usr по 1 записи из группы).
    Предыдущий запрос вернет пустой результат, поэтому будем делать через join'ы
    [sql]
    mysql> SELECT `data`.*, `uusr`.*, `musr`.* FROM `data` LEFT JOIN `usr` as `musr` ON (`musr`.`id`=`data`.`mid`) LEFT JOIN `usr` as `uusr` ON (`uusr`.`id`=`data`.`uid`);
    +----+-----+-----+------+------+------------+------+-------------+
    | id | uid | mid | date | id | name | id | name |
    +----+-----+-----+------+------+------------+------+-------------+
    | 1 | 1 | 2 | | NULL | NULL | 2 | David Blane |
    | 2 | 3 | 4 | | 3 | Will Smith | NULL | NULL |
    +----+-----+-----+------+------+------------+------+-------------+
    2 rows in set (0.00 sec)
    [/sql]

    Так все... у меня сегодня экзамен по сопромату=)
     
  5. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Kreker, СПАСИБО ОГРОМНОЕ!
    Я не знал, что можно таблице присвоить два разных виртуальных имени. Класс, очень помогло!