カテゴリー別アーカイブ: MySQL

MySQLで完全外部結合

説明のために, 2つのテーブルを定義しておきます.

table1
id title
1 パーフェクトJava
2 パーフェクトJavaScript
3 パーフェクトPHP

 

table2
id price
2 3456
3 3888
4 3200

 

完全外部結合した結果のテーブル

table1
id title id price
1 パーフェクトJava NULL NULL
2 パーフェクトJavaScript 2 3456
3 パーフェクトPHP 3 3888
NULL NULL 4 3200

 

FULL OUTER JOIN句が利用可能なデータベースであれば,

SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.id = table2.id

これで片付くのですが, MySQLではFULL OUTER JOIN句をサポートしていないので, 左外部結合 (LEFT OUTER JOIN) と 右外部結合 (RIGHT OUTER JOIN) の結果の和集合 (UNION) をとることで, 完全外部結合を実現します.

SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id = table2.id UNION SELECT * FROM table1 RIGHT OUTER JOIN table2 ON table1.id = table2.id

Mac OS X ローカルでMySQLを利用可能にする

備忘録的に…

1. まずは, MySQLをダウンロード. アカウント登録がめんどくさいけど, 費用はかからないのでご安心を

http://dev.mysql.com/downloads/mysql/

2. ダウンロードしたものをインストール (特に手動でやることはなし. ダウンロードしたファイルをダブルクリックするだけ)

3. MySQLを起動できる状態にはなっているけども, PDOインスタンスを生成しようとするとエラーが発生する. これは, PDOインスタンスに, UNIXドメインのソケットの指定がないので発生する

4. MySQLを起動して (システム環境設定のパネルにMySQLが入っているはず), コマンドプロンプトで以下のコマンドをたたく.

$ sudo mysqladmin -p version
....
Server version5.6.17
Protocol version10
ConnectionLocalhost via UNIX socket
UNIX socket/tmp/mysql.sock
....

この結果のUNIX socketのパスを覚えるなりメモしておく.

5. php.iniを編集する

設定ファイルをコピーしておきましょう

$ cp /private/etc/php.ini.default /private/etc/php.ini

php.iniの pdo_mysql.default_socket= に先ほどのUNIX socketのパスを指定する.

pdo_mysql.default_socket=/tmp/mysql.sock

念のため, ApacheとMySQLを再起動しておきます.

6. PDOインスタンス生成時にUNIXドメインのソケットを指定する.

$dsn = 'mysql'
           . ':dbname=sample'
           . ';unix_socket=/tmp/mysql.sock'
           . ';host=localhost';

$pdo = new PDO($dsn, 'root', 'password', []);

意外とやることが多いですが, これでローカル環境でもMySQLが利用できます.