SQLiteリファレンス
当サイトはSQLiteに関するSQL文やコマンドのリファレンスサイトです。
HOME > Lから始まるSQL文・コマンド

left outer join句

複数のテーブルを外部結合して表示するSQL文

複数のテーブルを外部結合して表示する方法

複数のテーブルを外部結合させるには、left outer join句を使用します。

left outer join句の書き方

select カラム名 from テーブル名 left outer join テーブル名 on 結合条件 where 抽出条件

left outer join句では、左側に指定したテーブルのデータを全て抽出します。

inner join句との違いは、共通した部分が無くても左側に指定したテーブルだけは表示し、右側にはnullを表示する点です。

left outer join句の使い方

以下は、postテーブル(投稿記事)とcateテーブル(カテゴリーテーブル)、 p_cテーブル(記事と記事が持っているカテゴリーの組み合わせ)の3つのテーブルを結合して、post.p_idでグループ化しています。

記事と記事が持っている複数のカテゴリーを取得しています。

PHPのPDOを使用した例

SQL
<?php
$pdo = new PDO("sqlite:./test.sqlite3");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_TIMEOUT,5);

$pdo->exec("create table p_c  ( p_id integer, c_id integer)");
$pdo->exec("create table cate ( c_id integer , name text)");
$pdo->exec("create table post ( p_id integer , title text)");
$pdo->exec("insert into post values ( 1, '今日は寒い' ) , (2,'暑いけど雨が降っている') , (3,'暑い') , (4,'暑くも寒くもない') ");
$pdo->exec("insert into cate values ( 1, 'ondo' ) ,  ( 2,'ame' )");
$pdo->exec("insert into p_c values ( 1,1) , (2,1),(2,2) ,(3,1)");

$stmt = $pdo->query("select post.p_id , post.title , group_concat(cate.name)
 from post left outer join p_c on post.p_id = p_c.p_id left outer join cate on 
 p_c.c_id = cate.c_id group by post.p_id ");
$result = $stmt->fetchAll();
echo "<pre>";
print_r($result);
echo "</pre>";
?>

SQLiteのGUIツールを使用した例

SQL
C:sq>sqlite3 test.sqlite3
sqlite> .headers on
sqlite> .mode column
sqlite> create table p_c  ( p_id integer , c_id integer );
sqlite> create table cate ( c_id integer , name text);
sqlite> create table post ( p_id integer , title text);
sqlite> insert into post values ( 1, '今日は寒い' ) , (2,'暑いけど雨が降っている') , (3,'暑い') ,(4,'暑くも寒くもない');
sqlite> insert into cate values ( 1, 'ondo' ) , ( 2,'ame' );
sqlite> insert into p_c values ( 1,1) , (2,1),(2,2) ,(3,1);
sqlite> select post.p_id , post.title , group_concat(cate.name)
 from post left outer join p_c on post.p_id = p_c.p_id left outer join cate on 
 p_c.c_id = cate.c_id group by post.p_id;