Born Too Late

Yuya's old tech blog.

MySQL でメールアドレスのドメインのみを抽出する

2010-03-14 11:13:21

以下のような、メールアドレス等の情報を保持したテーブルがあるとします。

mysql> SELECT * FROM users;
+----+---------+------------------+
| id | name    | mail             |
+----+---------+------------------+
|  1 | foo     | foo@yuyat.jp     |
|  2 | bar     | bar@yuyat.jp     |
|  3 | baz     | baz@example.com  |
|  4 | hoge    | hoge@example.org |
|  5 | moge    | moge@example.com |
|  6 | foobar  | foobar@yuyat.jp  |
|  7 | test    | test@example.net |
|  8 | example | example@yuyat.jp |
|  9 | mage    | mage@example.org |
| 10 | huga    | huga@example.com |
| 11 | piyo    | piyo@yuyat.jp    |
| 12 | hige    | hige@yuyat.jp    |
+----+---------+------------------+
12 rows in set (0.00 sec)

ここで、以下のような SQL を用意します。

SELECT
  SUBSTRING_INDEX(mail, '@', -1) AS domain
FROM
  users

すると、このような結果が得られます。

mysql> SELECT SUBSTRING_INDEX(mail, '@', -1) AS domain FROM users;
+-------------+
| domain      |
+-------------+
| yuyat.jp    |
| yuyat.jp    |
| example.com |
| example.org |
| example.com |
| yuyat.jp    |
| example.net |
| yuyat.jp    |
| example.org |
| example.com |
| yuyat.jp    |
| yuyat.jp    |
+-------------+
12 rows in set (0.00 sec)

また、以下の用にグルーピングすることで、ドメイン数順にソートすることも簡単です。

SELECT
  SUBSTRING_INDEX(mail, '@', -1) AS domain,
  COUNT(id) AS count
FROM
  users
GROUP BY
  domain
ORDER BY
  count DESC
mysql> SELECT SUBSTRING_INDEX(mail, '@', -1) AS domain, COUNT(id) AS count FROM users GROUP BY domain ORDER BY count DESC;
+-------------+-------+
| domain      | count |
+-------------+-------+
| yuyat.jp    |     6 |
| example.com |     3 |
| example.org |     2 |
| example.net |     1 |
+-------------+-------+
4 rows in set (0.00 sec)

これらの SQL で重要なのは SUBSTRING_INDEX という関数です。この関数は、ある文字列をデリミタで区切り、その n 番目を取得する というものなのですが、n に負の数を与えることで、末尾の要素を取得しています。