add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
DROP TABLE IF EXISTS `T1`;
CREATE TABLE IF NOT EXISTS `T1` (
`id` smallint NOT NULL AUTO_INCREMENT,
`TypeID` smallint DEFAULT NULL,
`GroupName` varchar(16) NOT NULL DEFAULT 'N/A',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;

INSERT INTO `T1` (`id`,`TypeID`,`GroupName`) VALUES
(1,1,'GName01'),
(2,1,'GName02');
Records: 2  Duplicates: 0  Warnings: 0
SELECT *
FROM T1;
id TypeID GroupName
1 1 GName01
2 1 GName02
DROP TABLE IF EXISTS `T2`;
CREATE TABLE IF NOT EXISTS `T2` (
`id` smallint NOT NULL AUTO_INCREMENT,
`TypeID` smallint DEFAULT NULL,
`GroupID` smallint NOT NULL DEFAULT '0',
`PersonID` smallint DEFAULT NULL,
`PersonName` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;

INSERT INTO `T2` (`id`,`TypeID`,`GroupID`,`PersonID`,`PersonName`) VALUES
(1,1,1,1,'Name01'),
(2,1,1,2,'Name02'),
(3,1,1,3,'Name03'),
(4,1,1,4,'Name04'),
(5,1,2,1,'Name05'),
(6,1,2,2,'Name06'),
(7,1,2,3,'Name07'),
(8,1,2,4,'Name08');
Records: 8  Duplicates: 0  Warnings: 0
SELECT *
FROM T2;
id TypeID GroupID PersonID PersonName
1 1 1 1 Name01
2 1 1 2 Name02
3 1 1 3 Name03
4 1 1 4 Name04
5 1 2 1 Name05
6 1 2 2 Name06
7 1 2 3 Name07
8 1 2 4 Name08
DROP TABLE IF EXISTS `T3`;
CREATE TABLE IF NOT EXISTS `T3` (
`id` smallint NOT NULL AUTO_INCREMENT,
`TypeID` smallint DEFAULT NULL,
`GroupID` smallint NOT NULL DEFAULT '0',
`Element1ID` smallint DEFAULT NULL,
`Element2ID` smallint DEFAULT NULL,
`Element3ID` smallint DEFAULT NULL,
`Element1Name` varchar(16) DEFAULT NULL,
`Element2Name` varchar(16) DEFAULT NULL,
`Element3Name` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;

INSERT INTO `T3` (`id`,`TypeID`,`GroupID`,`Element1ID`,`Element2ID`,`Element3ID`,`Element1Name`,`Element2Name`,`Element3Name`) VALUES
(1,1,1,NULL,NULL,NULL,NULL,NULL,NULL),
(2,1,1,NULL,NULL,NULL,NULL,NULL,NULL),
(3,1,1,1,NULL,NULL,'Name01',NULL,NULL),
(4,1,1,1,2,NULL,'Name01','Name02',NULL),
(5,1,1,2,3,4,'Name02','Name03','Name04'),
(6,1,1,2,4,NULL,'Name02','Name04',NULL),
(7,1,1,1,3,4,'Name01','Name03','Name04'),
(8,1,1,4,NULL,NULL,'Name04',NULL,NULL),
(9,1,2,NULL,NULL,NULL,NULL,NULL,NULL),
(10,1,2,3,4,NULL,'Name07','Name08',NULL),
(11,1,2,3,NULL,NULL,'Name07',NULL,NULL);
Records: 11  Duplicates: 0  Warnings: 0
SELECT *
FROM T3;
id TypeID GroupID Element1ID Element2ID Element3ID Element1Name Element2Name Element3Name
1 1 1 null null null null null null
2 1 1 null null null null null null
3 1 1 1 null null Name01 null null
4 1 1 1 2 null Name01 Name02 null
5 1 1 2 3 4 Name02 Name03 Name04
6 1 1 2 4 null Name02 Name04 null
7 1 1 1 3 4 Name01 Name03 Name04
8 1 1 4 null null Name04 null null
9 1 2 null null null null null null
10 1 2 3 4 null Name07 Name08 null
11 1 2 3 null null Name07 null null
/*
how many "hits" get members/persons in each group

|TypeID|GroupID |PersonID |PersonName |Hits |
|1 |1 |1 |Name01 |3 |
|1 |1 |2 |Name02 |3 |
|1 |1 |2 |Name03 |2 |
|1 |1 |4 |Name04 |4 |
|1 |2 |3 |Name07 |2 |
|1 |2 |4 |Name08 |1 |
*/
SELECT ID, TypeID, GroupID, Element1ID AS PersonID, Element1Name AS PersonName, 1 AS Element FROM T3 WHERE Element1ID IS NOT NULL
UNION ALL
SELECT ID, TypeID, GroupID, Element2ID AS PersonID, Element2Name AS PersonName, 2 AS Element FROM T3 WHERE Element2ID IS NOT NULL
UNION ALL
SELECT ID, TypeID, GroupID, Element3ID AS PersonID, Element3Name AS PersonName, 3 AS Element FROM T3 WHERE Element3ID IS NOT NULL;

ID TypeID GroupID PersonID PersonName Element
3 1 1 1 Name01 1
4 1 1 1 Name01 1
5 1 1 2 Name02 1
6 1 1 2 Name02 1
7 1 1 1 Name01 1
8 1 1 4 Name04 1
10 1 2 3 Name07 1
11 1 2 3 Name07 1
4 1 1 2 Name02 2
5 1 1 3 Name03 2
6 1 1 4 Name04 2
7 1 1 3 Name03 2
10 1 2 4 Name08 2
5 1 1 4 Name04 3
7 1 1 4 Name04 3
WITH T4 AS
(
SELECT ID, TypeID, GroupID, Element1ID AS PersonID, Element1Name AS PersonName, 1 AS Element FROM T3 WHERE Element1ID IS NOT NULL
UNION ALL
SELECT ID, TypeID, GroupID, Element2ID AS PersonID, Element2Name AS PersonName, 2 AS Element FROM T3 WHERE Element2ID IS NOT NULL
UNION ALL
SELECT ID, TypeID, GroupID, Element3ID AS PersonID, Element3Name AS PersonName, 3 AS Element FROM T3 WHERE Element3ID IS NOT NULL
)
SELECT TypeID, GroupID, PersonID, PersonName, COUNT(*) AS Hits
FROM T4
GROUP BY TypeID, GroupID, PersonID, PersonName
ORDER BY TypeID, GroupID, PersonID;
TypeID GroupID PersonID PersonName Hits
1 1 1 Name01 3
1 1 2 Name02 3
1 1 3 Name03 2
1 1 4 Name04 4
1 2 3 Name07 2
1 2 4 Name08 1
/*
how many "hits" get each group

|TypeID |GroupID|GroupName|Hits |
|1 |1 |GName01 |8 |
|1 |2 |GName02 |3 |
*/