English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
前の章で、一つのテーブルからデータを読み取る方法を学びました。これは比較的簡単ですが、実際のアプリケーションでは、よく複数のデータテーブルからデータを読み取る必要があります。
本節では、MySQLのJOINを使用して二つまたは複数のテーブルからデータをクエリする方法を紹介します。
SELECT、UPDATE、DELETE文でMySQLのJOINを使用して複数のテーブルを結合してクエリを実行できます。
JOINは機能に応じて以下の三つのカテゴリーに大別されます:
INNER JOIN(内結合、または等値結合):二つのテーブルのフィールドの一致関係を持つレコードを取得します。
LEFT JOIN(左結合):左テーブルのすべてのレコードを取得します。右テーブルに対応するレコードがない場合でもです。
RIGHT JOIN(右結合): LEFT JOIN の逆であり、左テーブルに対応するレコードがない場合でも右テーブルのすべてのレコードを取得するために使用されます。
本節で使用されるデータベース構造およびデータのダウンロード方法:w3codebox-mysql-join-test.sql。
私たちはw3codeboxデータベースには二つのテーブルが存在します tcount_tbl そして w3codebox_tbl。以下は二つのデータテーブルのデータです:
以下の例を試してみてください:
mysql> use w3codebox; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | w3codebox_author | w3codebox_count | +---------------+--------------+ | 基本教程網 | 10 | | oldtoolbag.com | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) 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 rows in set (0.01 sec)
次に、MySQLのINNER JOIN(INNERを省略してJOINを使用することもできますが、効果は同じです)これらのテーブルを結合してwを読み取ります3codebox_tblテーブルのすべてのw3codebox_authorフィールドがtcount_tblテーブルの対応するw3codebox_countフィールドの値:
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 rows in set (0.00 sec)
以下の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 rows in set (0.01 sec)
以下の例ではLEFT JOINを使用しています。この文は、左側のデータテーブルwをすべて読み取ります。3codebox_tblのすべての選択したフィールドデータ、右側のテーブルtcount_tblに対応するwがなくても3codebox_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 rows in set (0.01 sec)
上記の例ではRIGHT JOINを使用しています、この文は左側のテーブルw3codebox_tblには対応するw3codebox_authorフィールドの値。
PHPスクリプトでmysqli_query()関数を使用してSQL文を実行します、mysqli_query()関数の引数として上記のSQL文を使用できます。
以下の例を試してみてください:
<?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); ?>
以下の図に示される結果が出力されます: