データベースのグループ化の基本を説明します。
使用するpostsを表示しておきます。
SELECT * FROM posts;
mysql -h db -t -u dbuser -pdbpass myapp < main.sql
+----+---------+-------+----------+
| id | message | likes | area |
+----+---------+-------+----------+
| 1 | post-1 | 12 | TOKYO |
| 2 | post-2 | 8 | OKINAWA |
| 3 | post-3 | 11 | OKINAWA |
| 4 | post-4 | 3 | TOKYO |
| 5 | post-6 | 9 | HOKKAIDO |
| 6 | post-7 | 20 | TOKYO |
| 7 | post-9 | 31 | HOKKAIDO |
+----+---------+-------+----------+
目次
DISTINCT
DISTINCTを使うと、重複レコードを1つにまとめることができます。
SELECT DISTINCT area FROM posts;
mysql -h db -t -u dbuser -pdbpass myapp < main.sql
+----------+
| area |
+----------+
| TOKYO |
| OKINAWA |
| HOKKAIDO |
+----------+
カウントと組み合わせることもできます。
SELECT COUNT(DISTINCT area) FROM posts;
mysql -h db -t -u dbuser -pdbpass myapp < main.sql
+----------------------+
| COUNT(DISTINCT area) |
+----------------------+
| 3 |
+----------------------+
GROUP BY
GROUP BYを使うと、レコードをグループ化できます。
SELECT area, SUM(likes) FROM posts GROUP BY area;
mysql -h db -t -u dbuser -pdbpass myapp < main.sql
+----------+------------+
| area | SUM(likes) |
+----------+------------+
| HOKKAIDO | 40 |
| OKINAWA | 19 |
| TOKYO | 35 |
+----------+------------+
HAVING
HAVINGを使うと、レコードを抽出することができます。
SELECT
area,
SUM(likes)
FROM
posts
GROUP BY
area
HAVING
SUM(likes) > 30;
mysql -h db -t -u dbuser -pdbpass myapp < main.sql
+----------+------------+
| area | SUM(likes) |
+----------+------------+
| HOKKAIDO | 40 |
| TOKYO | 35 |
+----------+------------+
コメント