カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

ORDER BY句で使える条件式

SQLのORDER BY句では、特定のカラムを昇順や降順に並べ替えることができます。
更にCASE式を使えば任意の並び順にすることも可能です。

今回は、特定のカラムがNULLとなる場合があるテーブルで、NULLは最後にまとめて表示し、それ以外は昇順の表示になるようにしてみたいと思います。

例として以下のようなテーブルがあったとします。

TEST_TABLE
id name age
1 赤井 35
2 池田 22
3 内山 NULL
4 江崎 54
5 太田 NULL

年齢の昇順でデータを表示してみましょう。

SELECT * FROM TEST_TABLE ORDER BY age;

そうすると、NULLが先に表示され、それ以降が年齢の昇順という形になるかと思います。

TEST_TABLE
id name age
3 内山 NULL
5 太田 NULL
2 池田 22
1 赤井 35
4 江崎 54

これを、NULLは最後にまとめて表示し、それ以外を年齢の昇順で表示したい…というのが今回の焦点でしたね。
そのような場合にORDER BY句でCASEの条件式を使います。

SELECT * FROM TEST_TABLE 
ORDER BY
    CASE WHEN age IS NULL THEN 2 ELSE 1 END,
    age;

このようにORDER BY句でCASE式を使用し、年齢がNULLの場合の優先順位を下げてあげるわけです。
その後、年齢の昇順を指定しているので、実行結果の並び順は以下のようになります。

TEST_TABLE
id name age
2 池田 22
1 赤井 35
4 江崎 54
3 内山 NULL
5 太田 NULL

ただし、パフォーマンスはあまりよくないようなので、大規模なデータベースで使うのは避けたほうが良いかもしれません。

使いようによっては便利なので、是非一度試してみてください。

公式マニュアル:
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver16#Case

459 views

PDOのタイムアウト設定

MySQL接続にPDOを使用している場合のタイムアウト設定についてです。

PDOにはPDO::ATTR_TIMEOUTというオプションを設定することが出来ます。
設定する値は数値で、単位は秒です。

設定方法としてはPDOのインスタンスを生成するときに設定するか、後から設定する方法の2通りあります。

インスタンス生成のときに設定する

$dbh = new PDO('mysql:host=localhost;dbname=test', 
    $user, 
    $pass, 
    array(PDO::ATTR_TIMEOUT => 30)
);

後から設定する

PDO::setAttribute(PDO::ATTR_TIMEOUT, 30);

続きを読む…»

4,997 views

XAMPPでMySQLが起動しないエラー

XAMPPを使って開発をしていると、たまにMySQLがエラーで起動できなくなることがあります。
これまで同じ現象を2台のPCで経験しましたので、今後のためにも色々調べてみた中からなるべく簡単に戻せる方法をご紹介します。

まずはXAMPPでMySQLをスタートさせようとするとこのようなエラーが発生します。

エラー内容

Error: MySQL shutdown unexpectedly.
This may be due to a blocked port, missing dependencies, 
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums

翻訳すると…

エラーです。MySQLが予期せずシャットダウンしました。
これは、ブロックされたポート、欠落した依存関係、不適切な特権、クラッシュ、または他の方法によるシャットダウンが原因である可能性があります。
不適切な特権、クラッシュ、または他の方法によるシャットダウンが原因である可能性があります。
Logs ボタンを押してエラーログを表示し、Windows Event Viewer をチェックしてください。
Windowsイベント・ビューアーを確認してください。
さらに詳しい情報が必要な場合は、以下のログウィンドウをコピーしてフォーラムに投稿してください。
ログウィンドウ全体をコピーしてフォーラムに投稿してください。

別のサービスが同ポートを使用しているか、ファイルが破損していることが原因のようです。
私の場合は同ポートを使っているサービスはなかったので、データの復元を試みたところ解決しました。


xampp\mysql\dataフォルダーを一旦別の場所にコピーしておきます。
コピー出来たらxampp\mysql\dataの中身を全て削除します。

続きを読む…»

13,116 views

MySQLのテーブルから重複したレコードの抽出と削除

MySQLのテーブルで指定した列のデータが重複しているレコードを抽出、及び削除する方法をご紹介します。

まずはサンプルのテーブルを用意しましょう。

CREATE TABLE `sample` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `type` int(4) NOT NULL,
  PRIMARY KEY (`id`)
);

サンプルデータを登録します。

INSERT INTO `sample` VALUES
    (DEFAULT, '赤井', 1),
    (DEFAULT, '井田', 2),
    (DEFAULT, '宇野', 3),
    (DEFAULT, '江崎', 1),
    (DEFAULT, '奥本', 2);

テーブルの中身を見てみると次のようになります。

mysql> select * from `sample`;
+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 3  | 宇野   | 3    |
| 4  | 江崎   | 1    |
| 5  | 奥本   | 2    |
+----+--------+------+

typeに重複したデータがあることが分かります。
それではCOUNT関数とHAVING句を使って重複している件数を確認してみましょう。
続きを読む…»

4,155 views

MySQL 4から5へバージョンアップ

今回はまたまたとある環境でMySQLのバージョンアップを行いました。
4.1.20から5.0.95へのバージョンアップです。

ソースをダウンロードして解凍し、該当ディレクトリへ移動します。

コンパイルとインストール

configureを実行

./configure --with-charset=utf8 --with-extra-charset=all --with-mysqld-user=mysql
make
make install

インストールされるファイルやディレクトリ
/usr/local/lib/mysql … データディレクトリ
/usr/local/bin … mysql等の実行ファイル、その他関連コマンド
/usr/local/share/mysql … 言語ファイルや起動用のシェルスクリプト等
/usr/local/include/mysql … ヘッダーファイル


MySQLを初期化

/usr/local/bin/mysql_install_db --user=mysql \
--basedir=/usr/local \
--datadir=/usr/local/lib/mysql

続きを読む…»

1,416 views