2017-02-08 8 views
4

私は私がそれをしたい正確にどのように取り組んでいるいくつかのSQLコードがあります。MySQL UNION ALLはどのようにagregate関数を実行しますか?

select 10 as number, "Checklist 10 Foo" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
from checklist_10 
union all 
select 11 as number, "Checklist 11 Bar" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
from checklist_11 
union all 
select 12 as number, "Checklist 12 Baz" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
from checklist_12 

group by callsign, number 
order by max_ts 

結果:特に

number,name,max(id),max_ts,callsign,max(time_hint_utc),count(*) 
10,Checklist 10 Foo,2,1486554484635,VRTEST,2017-02-08 12:21:32,2 
11,Checklist 11 Bar,2,1486554490674,VRTEST,2017-02-08 12:21:39,2 
12,Checklist 12 Baz,2,1486554496378,VRTEST,2017-02-08 12:21:44,2 
12,Checklist 12 Baz,3,1486554496379,VRTEST2,2017-02-08 12:21:45,1 

を、私はmax()count()のための正しい結果を見ていmax IEとそれぞれcallsign/numbercountの組み合わせであり、個人のものではないselects

これはどのように機能しますか?集計関数は、テーブルレベルのselectsのように、のように見えますが、union allの結果と同じように機能します。

P.S.申し訳ありませんが、唯一の問題は私の理解の不足である質問をしてください。表の説明と


更新:

mysql> describe checklist_10; 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| Field   | Type               | Null | Key | Default | Extra   | 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| id   | bigint(20) unsigned           | NO | PRI | NULL | auto_increment | 
| ts   | bigint(20) unsigned           | NO |  | NULL |    | 
| callsign  | varchar(20)             | NO |  | NULL |    | 
| smg_id  | tinyint(3) unsigned           | NO |  | NULL |    | 
| time   | int(11)              | NO |  | NULL |    | 
| time_hint_utc | datetime              | NO |  | NULL |    | 
| reason  | enum('UNKNOWN','PERIODIC','SHIFT','MENU','EVENT','DECLINED') | NO |  | NULL |    | 
| foo0   | tinyint(1)             | NO |  | NULL |    | 
| foo1   | tinyint(1)             | NO |  | NULL |    | 
| foo2   | tinyint(1)             | NO |  | NULL |    | 
| foo3   | tinyint(1)             | NO |  | NULL |    | 
| foo4   | tinyint(1)             | NO |  | NULL |    | 
| foo5   | tinyint(1)             | NO |  | NULL |    | 
| foo6   | tinyint(1)             | NO |  | NULL |    | 
| foo7   | tinyint(1)             | NO |  | NULL |    | 
| foo8   | tinyint(1)             | NO |  | NULL |    | 
| foo9   | tinyint(1)             | NO |  | NULL |    | 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
17 rows in set (0.00 sec) 

mysql> describe checklist_11; 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| Field   | Type               | Null | Key | Default | Extra   | 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| id   | bigint(20) unsigned           | NO | PRI | NULL | auto_increment | 
| ts   | bigint(20) unsigned           | NO |  | NULL |    | 
| callsign  | varchar(20)             | NO |  | NULL |    | 
| smg_id  | tinyint(3) unsigned           | NO |  | NULL |    | 
| time   | int(11)              | NO |  | NULL |    | 
| time_hint_utc | datetime              | NO |  | NULL |    | 
| reason  | enum('UNKNOWN','PERIODIC','SHIFT','MENU','EVENT','DECLINED') | NO |  | NULL |    | 
| bar0   | tinyint(1)             | NO |  | NULL |    | 
| bar1   | tinyint(1)             | NO |  | NULL |    | 
| bar2   | tinyint(1)             | NO |  | NULL |    | 
| bar3   | tinyint(1)             | NO |  | NULL |    | 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
11 rows in set (0.00 sec) 

mysql> describe checklist_12; 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| Field   | Type               | Null | Key | Default | Extra   | 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| id   | bigint(20) unsigned           | NO | PRI | NULL | auto_increment | 
| ts   | bigint(20) unsigned           | NO |  | NULL |    | 
| callsign  | varchar(20)             | NO |  | NULL |    | 
| smg_id  | tinyint(3) unsigned           | NO |  | NULL |    | 
| time   | int(11)              | NO |  | NULL |    | 
| time_hint_utc | datetime              | NO |  | NULL |    | 
| reason  | enum('UNKNOWN','PERIODIC','SHIFT','MENU','EVENT','DECLINED') | NO |  | NULL |    | 
| baz0   | tinyint(1)             | NO |  | NULL |    | 
| baz1   | tinyint(1)             | NO |  | NULL |    | 
| baz2   | tinyint(1)             | NO |  | NULL |    | 
| baz3   | tinyint(1)             | NO |  | NULL |    | 
| baz4   | tinyint(1)             | NO |  | NULL |    | 
+---------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
12 rows in set (0.00 sec) 

データ:

mysql> select * from checklist_10; 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+------+------+------+------+------+------+ 
| id | ts   | callsign | smg_id | time  | time_hint_utc  | reason | foo0 | foo1 | foo2 | foo3 | foo4 | foo5 | foo6 | foo7 | foo8 | foo9 | 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+------+------+------+------+------+------+ 
| 1 | 1486554385343 | VRTEST |  7 | 1486556393 | 2017-02-08 12:19:53 | PERIODIC | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 
| 2 | 1486554484635 | VRTEST |  7 | 1486556492 | 2017-02-08 12:21:32 | SHIFT | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+------+------+------+------+------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from checklist_11; 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+ 
| id | ts   | callsign | smg_id | time  | time_hint_utc  | reason | bar0 | bar1 | bar2 | bar3 | 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+ 
| 1 | 1486554457077 | VRTEST |  7 | 1486556465 | 2017-02-08 12:21:05 | PERIODIC | 0 | 0 | 0 | 0 | 
| 2 | 1486554490674 | VRTEST |  7 | 1486556499 | 2017-02-08 12:21:39 | SHIFT | 1 | 1 | 1 | 1 | 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from checklist_12; 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+------+ 
| id | ts   | callsign | smg_id | time  | time_hint_utc  | reason | baz0 | baz1 | baz2 | baz3 | baz4 | 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+------+ 
| 1 | 1486554476903 | VRTEST |  7 | 1486556485 | 2017-02-08 12:21:25 | PERIODIC | 1 | 1 | 1 | 1 | 1 | 
| 2 | 1486554496378 | VRTEST |  7 | 1486556504 | 2017-02-08 12:21:44 | SHIFT | 1 | 1 | 1 | 1 | 1 | 
| 3 | 1486554496379 | VRTEST2 |  7 | 1486556505 | 2017-02-08 12:21:45 | SHIFT | 1 | 1 | 1 | 1 | 1 | 
+----+---------------+----------+--------+------------+---------------------+----------+------+------+------+------+------+ 
3 rows in set (0.00 sec) 

ありません1054エラー:あなたはそれがないと思うよう

mysql> select 10 as number, "Checklist 10 Foo" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
    -> from checklist_10 
    -> union all 
    -> select 11 as number, "Checklist 11 Bar" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
    -> from checklist_11 
    -> union all 
    -> select 12 as number, "Checklist 12 Baz" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
    -> from checklist_12 
    -> 
    -> group by callsign, number 
    -> order by max_ts; 
+--------+------------------+---------+---------------+----------+---------------------+----------+ 
| number | name    | max(id) | max_ts  | callsign | max(time_hint_utc) | count(*) | 
+--------+------------------+---------+---------------+----------+---------------------+----------+ 
|  10 | Checklist 10 Foo |  2 | 1486554484635 | VRTEST | 2017-02-08 12:21:32 |  2 | 
|  11 | Checklist 11 Bar |  2 | 1486554490674 | VRTEST | 2017-02-08 12:21:39 |  2 | 
|  12 | Checklist 12 Baz |  2 | 1486554496378 | VRTEST | 2017-02-08 12:21:44 |  2 | 
|  12 | Checklist 12 Baz |  3 | 1486554496379 | VRTEST2 | 2017-02-08 12:21:45 |  1 | 
+--------+------------------+---------+---------------+----------+---------------------+----------+ 
4 rows in set (0.00 sec) 
+1

はPLSのは、いくつかのサンプルデータを提供し、あなたのサンプルデータとあなたの上記のクエリ – Shadow

+0

@RyanVincentのおかげで、あなたの利益のために、私は」使用して、受信した出力:

ソリューションは、それぞれが選択でgroup by句を置くことでしたテーブルの説明とデータが追加されました。 – fadedbee

+1

私は不思議ですが、エラーでグループ内の1054の未知の列番号を取得していませんか? –

答えて

2

それは動作しません。 documentation

If you use a group function in a statement containing no GROUP BY clause, it is equivalent to grouping on all rows.

によるそれでは、ここで起こることは、あなたは、実際には2つの暗黙のgroup by(あなたがあなたのデータで異なるコールサインを持っている、たとえば場合には、必ず1行のみ、どんなにを返すでしょう)と1つの明示的なgroup byを持っているということです最後に選択したグループのみ

だからMySQLのために、あなたのクエリが見え、

(select 10 as number, "Checklist 10 Foo" as name, max(id), max(ts) as max_ts, 
    callsign, max(time_hint_utc), count(*) 
from checklist_10) 

union all 

(select 11 as number, "Checklist 11 Bar" as name, max(id), max(ts) as max_ts, 
    callsign, max(time_hint_utc), count(*) 
from checklist_11) 

union all 

(select 12 as number, "Checklist 12 Baz" as name, max(id), max(ts) as max_ts, 
    callsign, max(time_hint_utc), count(*) 
from checklist_12 
group by callsign, number) 

order by max_ts 

のように動作しますが、この例をテストすることができ行のいずれかのcallsignchecklist_10またはchecklist_11に変更してください。期待どおりにグループ化されません。または、最初のクエリまたは最後のクエリで、エイリアスnumberの名前をnumber1に変更します。後者の場合、group byは今すぐ列numberを見つけることができません。

また、選択リストに集計関数以外の列が含まれているため、only_full_group_by sqlモードを無効にした場合のみ、これが有効になります。

+2

私は同意します。オペレータは、クエリが期待される結果を生成するようにテストデータを設定する。 'vtest2'データが他のテーブルに追加された場合、その結果は彼の期待通りではありません。 – Shadow

+0

最後のselect句が他の2つの句と異なる理由はわかりません。なぜなら、あなたが書いたものを完全に理解していないからです。 – fadedbee

+2

@chrisdewあなたの最後のselectステートメントはgroup by節を持っていますが、他のステートメントはありません。グループの前の空の行は、グループをグループの結果に適用することはありません。 – Shadow

0

group byは、個々のselectsに結合するが、order byは選択のunion all上で動作していることと思われます。

mysql> select 10 as number, "Checklist 10 Foo" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
    -> from checklist_10 
    -> group by callsign 
    -> 
    -> union all 
    -> 
    -> select 11 as number, "Checklist 11 Bar" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
    -> from checklist_11 
    -> group by callsign 
    -> 
    -> union all 
    -> 
    -> select 12 as number, "Checklist 12 Baz" as name, max(id), max(ts) as max_ts, callsign, max(time_hint_utc), count(*) 
    -> from checklist_12 
    -> group by callsign 
    -> 
    -> order by max_ts 
    -> ; 
+--------+------------------+---------+---------------+----------+---------------------+----------+ 
| number | name    | max(id) | max_ts  | callsign | max(time_hint_utc) | count(*) | 
+--------+------------------+---------+---------------+----------+---------------------+----------+ 
|  10 | Checklist 10 Foo |  2 | 1486554484635 | VRTEST | 2017-02-08 12:21:32 |  2 | 
|  11 | Checklist 11 Bar |  2 | 1486554490674 | VRTEST | 2017-02-08 12:21:39 |  2 | 
|  12 | Checklist 12 Baz |  2 | 1486554496378 | VRTEST | 2017-02-08 12:21:44 |  2 | 
|  12 | Checklist 12 Baz |  3 | 1486554496379 | VRTEST2 | 2017-02-08 12:21:45 |  1 | 
|  10 | Checklist 10 Foo |  3 | 1486554496380 | VRTEST2 | 2017-02-08 12:21:46 |  1 | 
+--------+------------------+---------+---------------+----------+---------------------+----------+ 
5 rows in set (0.00 sec) 
関連する問題