サブノート

技術的なトピックが中心の備忘録

[MySQL]FROM句のサブクエリ

レジのデータテーブルから、データを取得する。

table  :register
columns:register_id, waiting, ...

レジ待ちしている人数毎のレジ数を一覧する。

> select waiting, count(*) as cnt from register group by waiting;

+---------+-----+
| waiting | cnt |
+---------+-----+
|       0 | 334 | -> 待ち人数なし
|       1 | 109 | -> 待ち人数1のレジが109個
|       2 |  73 | ->  :
|       3 |  31 | 
|       4 |   9 | 
|       5 |  11 | 
|       6 |   3 | 
|       7 |   3 | 
|       9 |   2 | ->  :
|      12 |   1 | -> 待ち人数12のレジが1個
+---------+-----+



レジ待ち人数の総計を計算する1

> select waiting, count(*) as cnt, waiting * cnt from register group by waiting;

ERROR 1054 (42S22): Unknown column 'cnt' in 'field list'

waiting と cnt を掛けたいのだが、cnt は認識されない。



レジ待ち人数の総計を計算する2

> SELECT waiting * cnt from (select waiting, count(*) as cnt from register group by waiting);

ERROR 1248 (42000): Every derived table must have its own alias

FROM句のサブクエリを使用したが、エイリアスが必要と言われる。



レジ待ち人数の総計を計算する3

> SELECT waiting * cnt from (select waiting, count(*) as cnt from register group by waiting) as t;

+---------------+
| waiting * cnt |
+---------------+
|             0 | 
|           109 | 
|           146 | 
|            93 | 
|            36 | 
|            55 | 
|            18 | 
|            21 | 
|            18 | 
|            12 | 
+---------------+

エイリアス(as t)を追加することで、cnt を使用した計算が可能となった。



レジ待ち人数の総計を計算する4

> SELECT sum(waiting * cnt) as sum from (select waiting, count(*) as cnt from register group by waiting) as t;

+-----+
| sum |
+-----+
| 508 | 
+-----+

sum() で総計を表示する。





追記:

上記「レジ待ち人数の総計を計算する3」は単純に以下でもできた。

> select waiting * count(*) as cnt from register group by waiting;

+-----+
| cnt |
+-----+
|   0 | 
| 109 | 
| 146 | 
|  93 | 
|  36 | 
|  55 | 
|  18 | 
|  21 | 
|  18 | 
|  12 | 
+-----+