English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В предыдущих главах мы уже научились читать данные из одной таблицы, это относительно просто, но в реальных приложениях часто нужно читать данные из нескольких таблиц.
В этой главе мы расскажем, как использовать JOIN MySQL для запросов данных в двух или более таблицах.
Вы можете использовать JOIN MySQL в SELECT, UPDATE и DELETE для объединения запросов к нескольким таблицам.
JOINroughly divided into the following three categories:
INNER JOIN (внутренний соединитель, или эквивалентный соединитель):: Получает записи, соответствующие условиям соответствия полей в двух таблицах.
LEFT JOIN (левый соединитель):Получает все записи левой таблицы, даже если в правой таблице нет соответствующих записей.
RIGHT JOIN (правый соединитель): В противоположность LEFT JOIN, используется для получения всех записей правой таблицы, даже если в левой таблице нет соответствующих записей.
Структура базы данных и данные для скачивания, используемые в этой главе:w3codebox-mysql-join-test.sql.
У нас в базе данных w3codebox есть две таблицы tcount_tbl и w3codebox_tbl. Данные в таблицах такие:
Попробуйте следующий пример:
mysql> use w3codebox; База данных изменена mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | w3codebox_author | w3codebox_count | +---------------+--------------+ | 基础教程网 | 10 | | oldtoolbag.com | 20 | | Google | 22 | +---------------+--------------+ 3 строк в наборе (0,01 сек) mysql> SELECT * from w3codebox_tbl; +-----------+---------------+---------------+-----------------+ | w3codebox_id | w3codebox_title | w3codebox_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | Учимся PHP | Основной учебник сеть | 2017-04-12 | | 2 | Учимся MySQL | Основной учебник сеть | 2017-04-12 | | 3 | Учимся Java | oldtoolbag.com | 2015-05-01 | | 4 | Учимся Python | oldtoolbag.com | 2016-03-06 | | 5 | Учимся C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 строк в наборе (0.01 сек)
Далее мы используем MySQLINNER JOIN (можно также опустить INNER и использовать только JOIN, эффект будет одинаковым)Используя INNER JOIN для подключения указанных таблиц и чтения значений поля w3codebox_author из таблицы w3codebox_tbl и соответствующего поля w3codebox_count из таблицы tcount_tbl:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Основной учебный сайт | 10 | | 2 | Основной учебный сайт | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 строк в наборе (0.00 сек)
Данное SQL предложение эквивалентно:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a, tcount_tbl b WHERE a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Основной учебный сайт | 10 | | 2 | Основной учебный сайт | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)
MySQL left join и join различаются. MySQL LEFT JOIN будет читать все данные левой таблицы, даже если в правой таблице нет соответствующих данных.
Попробуйте следующий пример, чтобы w3codebox_tbl Для левой таблицы,tcount_tbl Для правой таблицы, понимание применения MySQL LEFT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a LEFT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Основной учебный сайт | 10 | | 2 | Основной учебный сайт | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 строк в наборе (0.01 сек)
В предыдущем примере использовался LEFT JOIN, этот запрос будет читать все поля левой таблицы w3codebox_tbl, даже если в правой таблице tcount_tbl нет соответствующего значения w3codebox_author.
MySQL RIGHT JOIN будет читать все данные правой таблицы, даже если в левой таблице нет соответствующих данных.
Попробуйте следующий пример, чтобы w3codebox_tbl Для левой таблицы,tcount_tbl Для правой таблицы, понимание применения MySQL RIGHT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a RIGHT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Основной учебный сайт | 10 | | 2 | Основной учебный сайт | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 строк в наборе (0.01 сек)
В данном примере используется RIGHT JOIN, который будет читать все поля из таблицы tcount_tbl, даже если в левой таблице w3codebox_tbl нет соответствующего значения w3codebox_author.
В PHP вы можете использовать функцию mysqli_query() для выполнения SQL-запросов, вы можете использовать приведенный выше SQL-запрос в качестве параметра функции mysqli_query().
Попробуйте следующий пример:
<?php $dbhost = 'localhost'; // Адрес сервера MySQL $dbuser = 'root'; // Логин пользователя MySQL $dbpass = '123456'; // Пароль пользователя MySQL $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if (!$conn) { die('Ошибка подключения: ' . mysqli_error($conn)); } // Установка кодировки, предотвращение неправильного отображения китайских иероглифов mysqli_query($conn, "set names utf8"); $sql = 'SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author'; mysqli_select_db($conn, 'w3codebox'); $retval = mysqli_query($conn, $sql); if(! $retval ) { die('Не удается прочитать данные: ' . mysqli_error($conn)); } echo '<h2>Учебный сайт MySQL JOIN тест<h2>'; echo '<table border="1"><tr><td>ID учебника</td><td>Автор</td><td>Количество входов</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['w3codebox_id']}</td> ". "<td>{$row['w3codebox_author']} </td> ". "<td>{$row['w3codebox_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
Результат вывода показан на рисунке ниже: