базовый курс

ГРУППА КУРСА

Выборка из двух таблиц

Это довольно сложная тема, но её нужно знать, потому что выборка из двух таблиц используются достаточно часто. Это лучше сразу объяснять на примере. Предположим, есть таблица с зарегистрированными пользователями. Она называется users. Примерно такая, как мы создавали, только в ней больше полей, содержащих различную информацию о пользователе. Зарегистрированные пользователи могут писать комментарии к статьям сайта, и для этого нужно создать ещё одну таблицу с названием comments. Каждый комментарий - это одна запись. Очевидно, что должно отображаться, кто написал конкретный комментарий. Нам нужно, чтобы было указано имя, фамилия, город и имэйл пользователя. Значит все эти данные должны быть в каждой записи таблицы с комментаримями. Но это не рационально, ведь один пользователь может написать сто комментариев к разным статьям. И одинаковая информация будет сто раз записана в таблицу вместе с текстами комментариев. Поэтому, часто делают по-другому. В таблице с комментариями все поля, связанные с пользователем, заменены одним полем: id пользователя. Это id записи в таблице users. В ней содержатся все данные о пользователе. Когда конкретный комментарий выводится на страницу, то информацию о том, кто его написал, мы получаем из поля id пользователя. Затем данные об этом пользователе берутся из таблицы users.

Существует возможность отправить запрос на выборку сразу из двух таблиц. Если у Вас есть таблица users, имеющая поле id, а также таблица comments, имеющая поле user_id, то скрипт, выводящий все комментарии с данными пользователей, будет выглядеть так:

+
1
2
<?php
header('Content-type: text/html; charset=utf-8');
3
4
5
6
7
8
9
10
11
12
$db=mysqli_connect('localhost', 'root', '', 'mybase');
$query="SELECT * FROM comments, users WHERE comments.user_id = users.id";
$result=mysqli_query($db, $query);
for ($i=0; $i<mysqli_num_rows($result); $i++)
  {
  $row=mysqli_fetch_row($result);
  print_r($row);
  echo '<br>';
  }
mysqli_close($db);

Запрос, который отправляет данный скрипт выполняется так: берётся первая запись таблицы comments, из неё берётся значение поля user_id. Затем в таблице users ищется запись в которой поле id имеет такое же значение. В результат записываются все поля первой записи таблицы comments и все поля найденной записи таблицы users. Из них складывается одна запись результата. Затем берётся второй комментарий и для него производятся те же действия. И так со всеми комментариями.

В нашем примере у каждого комментария может быть только один автор, поэтому каждой записи первой таблицы соответствует только одна запись второй таблицы. Но так бывает не всегда. Предположим, что мы находим пользователей не по id, а по городу. Подобный запрос будет работать так: Берётся запись первой таблицы и находится соответствующая ей запись второй таблицы. Из них составляется запись результата. Затем для записи первой таблицы находится другая запись второй таблицы и из них также составляется запись результата. И так находятся все записи во второй таблице, которые соответствуют условию. И только потом начинаеся поиск для следующей записи первой таблицы.

Так как названия полей из разных таблиц могут совпадать, то результат нужно переводить не в ассоциативный массив, а в индексированный.

Совсем не обязательно отправлять запрос на выборку из двух таблиц. Можно сделать иначе: сначала взять из базы данных комментарии, узнать id всех пользователей, которые их писали, а потом получить данные этих пользователей. Иногда это даже удобнее, потому что информация о каждом пользователе будет отправлена только один раз. Но обрабатывать эти запросы несколько сложее, ведь сам комментарий и данные пользователя будут получены в двух разных запросах.