The first thing you need is a messy query to create each column
FIRST PHASE OF QUERY
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;
YOUR SAMPLE DATA
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>
FIRST PHASE OF QUERY EXECUTED
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>
Let's create each for each env value
QUERY
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';
QUERY EXECUTED
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>
FINAL QUERY (with id wedged in)
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';
FINAL QUERY (with id wedged in) EXECUTED
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>
GIVE IT A TRY !!!
Best Answer
Tested at SQL-Fiddle: test-1
If you wanted the results in two rows instead of one, it would be easier, just
GROUP BY
bothtype, info
:This can also be used to provide the one-row-per-type format you want:
Tested at SQL-Fiddle: test-2
The above two queries would benefit from an index on
(type, info, name)
The following would benefit from an index on
(info, type, name)
:Tested at SQL-Fiddle: test-3