Mysql
group_concat 和 group by 在一起
我正在嘗試使用
group_concat
,concat
和其他函式編寫查詢,但我遇到了無法加入和分組數據以在 1 個單元格中表示它們的問題。這是我的數據的方式…
table1 +-----+---------+ | id | ... | +-----+---------+ | 1 | | | 2 | | | 3 | | +-----+---------+ table2 +-----+-----+-------+ | id | env | infid | +-----+-----+-------+ | 1 | p | 10 | | 1 | p | 11 | | 1 | p | 20 | | 1 | p | 12 | | 1 | D | 21 | | 1 | D | 22 | +-----+-----+-------+ table3 +-------+---------+---------+ | infid | inftype | infname | +-------+---------+---------+ | 10 | Srv | abc | | 20 | Srv | xyz | | 11 | Db | hgj | | 12 | Db | kjk | | 21 | Srv | pop | | 22 | Db | kli | +-------+---------+---------+
預期的查詢結果
+-----+------------------------------+---------------------+ | id | P | D | +------------------------------------+---------------------+ | 1 |Srv: [abc, xyz] Db: [hgj, kjk]|Srv: [pop] Db: [Kli] | +-----+------------------------------+---------------------+
任何幫助是極大的讚賞。
您需要的第一件事是創建每一列的凌亂查詢
查詢的第一階段
SELECT env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') ORDER BY inftype DESC SEPARATOR ' ') tags FROM (SELECT env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname FROM table1 AAA INNER JOIN table2 BBB ON AAA.id = BBB.id INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA GROUP BY env,inftype) A GROUP BY env;
您的樣本數據
mysql> DROP DATABASE IF EXISTS kumar_concat; Query OK, 3 rows affected (0.03 sec) mysql> CREATE DATABASE kumar_concat; Query OK, 1 row affected (0.00 sec) mysql> USE kumar_concat Database changed mysql> CREATE TABLE table1 -> ( -> id INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id) -> ); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO table1 VALUES (),(),(); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> CREATE TABLE table2 -> ( -> id INT NOT NULL, -> env VARCHAR(10) NOT NULL, -> infid INT NOT NULL, -> PRIMARY KEY (id,infid) -> ); Query OK, 0 rows affected (0.04 sec) mysql> INSERT INTO table2 (id,env,infid) VALUES -> (1,'P',10), (1,'P',11), (1,'P',20), -> (1,'P',12), (1,'D',21), (1,'D',22); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> CREATE TABLE table3 -> ( -> infid INT NOT NULL, -> inftype VARCHAR(10) NOT NULL, -> infname VARCHAR(10) NOT NULL, -> PRIMARY KEY (infid) -> ); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO table3 (infid,inftype,infname) VALUES -> (10,'Srv','abc'), (20,'Srv','xyz'), (11,'Db','hgj'), -> (12,'Db','kjk'), (21,'Srv','pop'), (22,'Db','kli'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql>
已執行查詢的第一階段
mysql> SELECT env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') -> ORDER BY inftype DESC SEPARATOR ' ') tags -> FROM (SELECT env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names -> FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname -> FROM table1 AAA -> INNER JOIN table2 BBB ON AAA.id = BBB.id -> INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA -> GROUP BY env,inftype) A GROUP BY env; +-----+------------------------------+ | env | tags | +-----+------------------------------+ | D | Srv [pop] Db [kli] | | P | Srv [abc, xyz] Db [hgj, kjk] | +-----+------------------------------+ 2 rows in set (0.02 sec) mysql>
讓我們為每個 env 值創建每個
詢問
SELECT T1.tags P,T2.tags D FROM (SELECT env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') ORDER BY inftype DESC SEPARATOR ' ') tags FROM (SELECT env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname FROM table1 AAA INNER JOIN table2 BBB ON AAA.id = BBB.id INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA GROUP BY env,inftype) A GROUP BY env) T1, (SELECT env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') ORDER BY inftype DESC SEPARATOR ' ') tags FROM (SELECT env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname FROM table1 AAA INNER JOIN table2 BBB ON AAA.id = BBB.id INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA GROUP BY env,inftype) A GROUP BY env) T2 WHERE T1.env='P' AND T2.env='D';
查詢已執行
mysql> SELECT -> T1.tags P,T2.tags D -> FROM -> (SELECT env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') -> ORDER BY inftype DESC SEPARATOR ' ') tags -> FROM (SELECT env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names -> FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname -> FROM table1 AAA -> INNER JOIN table2 BBB ON AAA.id = BBB.id -> INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA -> GROUP BY env,inftype) A GROUP BY env) T1, -> (SELECT env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') -> ORDER BY inftype DESC SEPARATOR ' ') tags -> FROM (SELECT env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names -> FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname -> FROM table1 AAA -> INNER JOIN table2 BBB ON AAA.id = BBB.id -> INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA -> GROUP BY env,inftype) A GROUP BY env) T2 -> WHERE T1.env='P' -> AND T2.env='D'; +------------------------------+--------------------+ | P | D | +------------------------------+--------------------+ | Srv [abc, xyz] Db [hgj, kjk] | Srv [pop] Db [kli] | +------------------------------+--------------------+ 1 row in set (0.05 sec) mysql>
最終查詢(插入 id)
SELECT T1.id,T1.tags P,T2.tags D FROM (SELECT id,env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') ORDER BY inftype DESC SEPARATOR ' ') tags FROM (SELECT id,env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname FROM table1 AAA INNER JOIN table2 BBB ON AAA.id = BBB.id INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA GROUP BY id,env,inftype) A GROUP BY id,env) T1 INNER JOIN (SELECT id,env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') ORDER BY inftype DESC SEPARATOR ' ') tags FROM (SELECT id,env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname FROM table1 AAA INNER JOIN table2 BBB ON AAA.id = BBB.id INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA GROUP BY id,env,inftype) A GROUP BY id,env) T2 USING (id) WHERE T1.env='P' AND T2.env='D';
最終查詢(已插入 id)已執行
mysql> SELECT -> T1.id,T1.tags P,T2.tags D -> FROM -> (SELECT id,env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') -> ORDER BY inftype DESC SEPARATOR ' ') tags -> FROM (SELECT id,env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names -> FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname -> FROM table1 AAA -> INNER JOIN table2 BBB ON AAA.id = BBB.id -> INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA -> GROUP BY id,env,inftype) A GROUP BY id,env) T1 -> INNER JOIN -> (SELECT id,env,GROUP_CONCAT(CONCAT(inftype,' [',names,']') -> ORDER BY inftype DESC SEPARATOR ' ') tags -> FROM (SELECT id,env,inftype,GROUP_CONCAT(infname ORDER BY infname SEPARATOR ', ') names -> FROM (SELECT AAA.id,BBB.infid,BBB.env,CCC.inftype,CCC.infname -> FROM table1 AAA -> INNER JOIN table2 BBB ON AAA.id = BBB.id -> INNER JOIN table3 CCC ON BBB.infid = CCC.infid) AA -> GROUP BY id,env,inftype) A GROUP BY id,env) T2 -> USING (id) WHERE T1.env='P' AND T2.env='D'; +----+------------------------------+--------------------+ | id | P | D | +----+------------------------------+--------------------+ | 1 | Srv [abc, xyz] Db [hgj, kjk] | Srv [pop] Db [kli] | +----+------------------------------+--------------------+ 1 row in set (0.08 sec) mysql>
試一試 !!!