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

Раздел SQL. Форум в помощь для тех кто начинает осваивать SQL. Работа с phpMyAdmin.
Аватара пользователя
Slash
Администратор
Сообщения: 2031
Поблагодарили: 62 раза

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

Сообщение Slash » Чт сен 18, 2014 9:36 am

Здравствуйте.
Совсем недавно делал систему комментариев для фотографий, на одном своем проекте. Встала задача делать выборку сразу из двух таблиц. Сначала из одной таблице получить информацию о комменте, затем из другой получить информацию о авторе коммента и всю полученную информацию из двух таблиц соединить в одном блоке. И так вот две таблицы:
comments
  • id_comment (идентификатор коммента)
  • subject (комментируемый предмет)
  • comments (текст комментария)
  • data_comment (дата написания коммента)
  • author (идентификатор автора коммента)
user
  • id_user (идентификатор пользователя)
  • login (логин, имя пользователя)
  • mail (электронная почта пользователя)
  • password (пароль пользователя для входа в систему)
  • date_reg (дата регистрации пользователя)
Выборка из одой таблицы делается так:

Код: Выделить всё

$sql = "SELECT * 
    FROM comments
    WHERE subject = '
$photo'    
    ORDER BY id_comment DESC"
;
$query = mysqli_query($connect, $sql) or die(mysqli_error()); 

Таким образом мы можем вывести все комментарии к определенной фотографии, но о авторе комментов мы ни чего не будем знать кроме его идентификаторе (id). Я хочу видеть имя того, кто написал тот или иной коммент, конечно в таблице comments, в поле author можно вставлять логин пользователя вместо его идентификатора, но а если пользователь сменит свое имя? Что будет тогда? В комментариях будет отображаться неверная информация о авторе.
В общем делаем, как я писал выше, сначала получаем информацию о комменте, затем о его авторе:

Код: Выделить всё

$sql = "SELECT * 
    FROM comments a, user b
    WHERE a.subject = '
$photo'
    AND b.id_user = a.author    
    ORDER BY a.id_comment DESC"
;
$query = mysqli_query($connect, $sql) or die(mysqli_error());

Рассказываю, что я сделал: первая строчка $sql = "SELECT * (выбрать всё) осталась без изменений, последняя строчка тоже не изменилась, а вот все остальные были изменены.
Вторая строчка FROM comments a, user b - (из каких таблиц делать выборку) идет перечисление таблиц с присвоенными им буквами a и b. Таблицы comments принадлежит буква a, таблице user буква b. Присваивание букв делается для команды из какой таблицы, что выбирать.
В третей строке WHERE a.subject = '$photo' запрос говорит, что выборку надо делать в таблице, которой присвоена буква a (то есть comments) по значению переменной $photo.
Далее, четвертая строка AND b.id_user = a.author запрос говорит - продолжать выборку, но уже в таблице с буквой b (то есть user). Тут мы получаем информацию о пользователе с одинаковым идентификатором автора коммента из таблицы comments и пользователя из таблицы user.
Пятая строка запроса ORDER BY a.id_comment DESC"; - командует о сортировке комментариев в обратном порядке по содержимому поля id_comment, из таблицы с буквой a.

Прошу заметить, что у меня в таблицах нет одинаковых названий полей, все названия уникальны. То есть, я даже не назвал поля идентификатора коммента или пользователя не просто id, я дал им названия id_comment и id_user, что бы избежать ошибок. В общем одинаковых названий не должно быть, иначе ошибок не избежать.
Реклама

Вернуться в «MySQLi»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость