ФорумПрограммированиеPHP для идиотов → Связать 3 таблицы

Связать 3 таблицы

  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 0:43

    Здравствуйте уважаемые эксперты!
    Подскажите, каким образом лучше связать 4 таблицы из БД, точнее сделать это одним запросом.

    Таблицы собственно следующие:

    1. users
    [table border=1]
    [tr]
     [td]id[/td]
     [td]u_name[/td]
    [/tr]
    [/table]

     


    2. test1
    [table border=1]
    [tr]
     [td]user_id[/td]
     [td]test1_id[/td]
    [/tr]
    [/table]



    3.  test2
    [table border=1]
    [tr]
     [td]test2_id[/td]
     [td]course_id[/td]
    [/tr]
    [/table]


    4. course
    [table border=1]
    [tr]
     [td]c_id[/td]
     [td]c_name[/td]
    [/tr]
    [/table]



    Собственно, нужно извлечь из 1-й таблицы name юзера.
    Из 2-й мы берем test1_id, если user_id = id из 1-й таблицы и сравниваем с test2_id из 3-й таблицы. Если есть запоминаем course_id.
    Из 4-й берем c_name, сравнивая c_id с course_id.

    На выходе u_name(из 1-й) и c_name(из 4-й)
    Вот так вот…





  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 0:45, спустя 1 минуту 38 секунд

    на вскидку - юзай "* Join"
    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 0:49, спустя 4 минуты 26 секунд

    надо какого-то конкретного u_name? связь я понял, а условие нет
    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 0:55, спустя 6 минут 17 секунд

    Если всех u_name+c_name, то


    SELECT
       u.u_name, c.c_name
    FROM users AS u
    LEFT JOIN test1 AS t1
       ON t1.user_id = u.id
    LEFT JOIN test2 AS t2
       ON t1.test1_id = t2.test2_id
    LEFT JOIN course AS c
       ON t2.course_id = c.c_id
    adw/0
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 0:58, спустя 2 минуты 31 секунду

    Есть таблица юзеров, в которых имя, фамилия…
    Есть таблица с указанием user_id, в которой есть некая переменная.
    Эту переменную нужно сравнить в третьей таблице, в которой номер курса = переменной.
    А в четвертой таблице название курса и айди курса. И как вы уже догадались, номер курса из третьей таблицы и есть айди курса.

    Мне нужно вывести список пользователей и их курсы…
    Джойнами добился лишь связи 3-х таблиц… не получается что то…

    З.Ы. злоебучий Мудл, сорри за оффтоп)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 1:07, спустя 9 минут 33 секунды



    пора на следующий уровень переходить, а то бушь дальше такие вопросы задавать =)))))
    Сапожник без сапог
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 1:11, спустя 3 минуты 47 секунд

    эээ, задача даже немного усложнилась…
    Спустя 95 сек.
    Есть таблица юзеров, в которых имя, фамилия…
    Есть таблица с указанием user_id, в которой есть некая переменная.
    Эту переменную нужно сравнить в третьей таблице, в которой айди третьей таблицы = переменной. Если равно, взять из третьей таблицы номер курса и идем на четвертую таблицу.
    А в четвертой таблице название курса и айди курса. И как вы уже догадались, номер курса из третьей таблицы и есть айди курса.

    Вот точно отображает то, чего мне надоманама)

    Дуд, я не вкурил, что ты имел ввиду)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 1:12, спустя 1 минуту 5 секунд

    relictx, мой запрос не подходит?
    adw/0
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 1:13, спустя 40 секунд

    А еще мужик из Австралии когда писал мудл точно был обкуренный садист)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 1:14, спустя 45 секунд

    Что такое "мудл"?
    adw/0
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 1:15, спустя 1 минуту 4 секунды


    relictx, мой запрос не подходит?


    К сожалениею нет…
    Спустя 19 сек.
    http://moodle.org/
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 1:24, спустя 8 минут 42 секунды

    вот я накидал говнокод, но последний запрос в запросе не пашет… Первый запрос правильный и отображает переменную из 3-й таблицы…


    <table border=1>
     <tr>
      <th>Login</th>
      <th>Username</th>
      <th>Course</th>
     </tr>


    <?

    $sql_users="SELECT mdl_user.firstname as first, mdl_user.lastname as last, mdl_context.contextlevel as cour
                FROM mdl_context, mdl_user
                LEFT JOIN mdl_role_assignments
                ON mdl_user.id=mdl_role_assignments.userid

                WHERE ((mdl_role_assignments.userid=mdl_user.id)and(mdl_role_assignments.contextid=mdl_context.id))";


    $result_users = mysqli_query($_SESSION['link'],$sql_users);
    $rows_count_users=mysqli_num_rows($result_users);




     while($rows_count_users = mysqli_fetch_assoc($result_users)){


      $sql="SELECT *
                FROM mdl_course
                WHERE id=".$rows_count_users['cour'];



      $result = mysqli_query($_SESSION['link1'],$sql);
      $rows_count=mysqli_num_rows($result);


      echo'<tr>';
       echo'<td>';
        echo $rows_count_users['first'];
       echo'</td>';
       echo'<td>';
        echo $rows_count_users['last'];
       echo'</td>';
       echo'<td>';
        echo $rows_count['shortname'];
       echo'</td>';
      echo'</tr>';
     }

    ?>

    </table>
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 3 ноября 2009 г. 4:07, спустя 2 часа 43 минуты 7 секунд

    Вот он говно код для тестирования)))
    Все работает. Вопрос в следующем, как сделать все одним скуль запросом, а не тремя как в моем говно коде?)



    <?

    $sql_users="SELECT mdl_user.id, mdl_user.firstname as first, mdl_user.lastname as last,mdl_role_assignments.contextid as cid
    FROM mdl_role_assignments, mdl_user
    WHERE mdl_role_assignments.userid=mdl_user.id
    ORDER BY mdl_user.id";



    $result_users = mysqli_query($_SESSION['link'],$sql_users);
    $rows_count_users=mysqli_num_rows($result_users);




    while($rows_count_users = mysqli_fetch_assoc($result_users)){

    $sql1="SELECT mdl_context.instanceid as cour
    FROM mdl_context
    WHERE id=".$rows_count_users['cid'];



    $result1 = mysqli_query($_SESSION['link'],$sql1);
    $rows_count1=mysqli_fetch_assoc($result1);




    $sql2="SELECT shortname
    FROM mdl_course
    WHERE id=".$rows_count1['cour'];

    $result2 = mysqli_query($_SESSION['link'],$sql2);
    $rows_count2=mysqli_fetch_assoc($result2);

    echo 'Бла-бла…';

    }
    ?>

  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 3 ноября 2009 г. 4:09, спустя 1 минуту 53 секунды

    как сделать все одним скуль запросом, а не тремя как в моем говно коде?)

    юзай JOIN

Пожалуйста, авторизуйтесь, чтобы написать комментарий!