English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL接続の使用

前の章で、一つのテーブルからデータを読み取る方法を学びました。これは比較的簡単ですが、実際のアプリケーションでは、よく複数のデータテーブルからデータを読み取る必要があります。

本節では、MySQLのJOINを使用して二つまたは複数のテーブルからデータをクエリする方法を紹介します。

SELECT、UPDATE、DELETE文でMySQLのJOINを使用して複数のテーブルを結合してクエリを実行できます。

JOINは機能に応じて以下の三つのカテゴリーに大別されます:

  • INNER JOIN(内結合、または等値結合):二つのテーブルのフィールドの一致関係を持つレコードを取得します。

  • LEFT JOIN(左結合):左テーブルのすべてのレコードを取得します。右テーブルに対応するレコードがない場合でもです。

  • RIGHT JOIN(右結合): LEFT JOIN の逆であり、左テーブルに対応するレコードがない場合でも右テーブルのすべてのレコードを取得するために使用されます。

本節で使用されるデータベース構造およびデータのダウンロード方法:w3codebox-mysql-join-test.sql

コマンドプロンプトで INNER JOIN を使用して

私たちは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

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

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スクリプトでJOINを使用する

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);
?>

以下の図に示される結果が出力されます: