Inleiding
Er zijn 3 tabellen: tbl_theme, tbl_article en tbl_thm_connection. De laatste is een koppeltabel voor de eerste 2 (er is dus sprake van een 'veel-op-veel' relatie)
hier een vereenvoudigde (maar werkende) table-dump:
De query die ik daarvoor in gedachte had is deze:
Heeft iemand enig idee hoe ik dit het beste kan aanpakken ?
Alvast bedankt!
(Database is MySQL 4.0.15, dus subqueries zijn niet mogelijk)
In werkelijkheid is de tabellenstructuur een stuk uitgebreider maar om het probleem te lokaliseren heb ik het tot de kern teruggebracht
Er zijn 3 tabellen: tbl_theme, tbl_article en tbl_thm_connection. De laatste is een koppeltabel voor de eerste 2 (er is dus sprake van een 'veel-op-veel' relatie)
hier een vereenvoudigde (maar werkende) table-dump:
code:
Het resultaat dat ik zou willen is als volgt:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| CREATE TABLE `tbl_theme` (
`thm_id` INT NOT NULL AUTO_INCREMENT ,
`thm_name` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `thm_id` )
);
INSERT INTO `tbl_theme` (`thm_name` )
VALUES ('Thema 1'), ('Thema 2'), ('Thema 3'),('Thema 4'), ('Thema 5');
CREATE TABLE `tbl_article` (
`art_id` INT NOT NULL AUTO_INCREMENT ,
`art_title` VARCHAR( 50 ) NOT NULL ,
`art_state` ENUM( 'A', 'B', 'C' ) NOT NULL ,
PRIMARY KEY ( `art_id` )
);
INSERT INTO `tbl_article` (`art_title`, `art_state`) VALUES
('Artikel 1', 'A'), ('Artikel 2', 'A'), ('Artikel 3', 'A'),
('Artikel 4', 'A'), ('Artikel 5', 'A'), ('Artikel 6', 'B'),
('Artikel 7', 'B'), ('Artikel 8', 'C'), ('Artikel 9', 'C'),
('Artikel 10', 'C');
CREATE TABLE `tbl_thm_connection` (
`con_thm_id` INT NOT NULL ,
`con_art_id` INT NOT NULL ,
PRIMARY KEY ( `con_thm_id` , `con_art_id` )
);
INSERT INTO `tbl_thm_connection` (`con_thm_id`, `con_art_id`) VALUES
(1,1),(1,6),(1,8),(1,9),(2,2),(2,7),(2,8),(3,3),(3,4),(3,5),
(4,6),(4,8),(4,10),(5,10),(5,1),(5,6); |
code:
Dus voor elk thema het aantal artikelen dat een bepaalde status heeft1
2
3
4
5
6
7
8
9
| ------------------------------------------ | thm_name | state_a | state_b | state_c | ------------------------------------------ | Thema 1 | 1 | 1 | 2 | | Thema 2 | 1 | 1 | 1 | | Thema 3 | 3 | 0 | 0 | | Thema 4 | 0 | 1 | 2 | | Thema 5 | 1 | 1 | 1 | ------------------------------------------ |
De query die ik daarvoor in gedachte had is deze:
code:
Alleen dit geeft niet het gewenste resultaat: afhankelijk van het aantal matches wordt de count meerdere keren geteld.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| SELECT
thm_name
, COUNT(art_s1.art_id) as articles_s1
, COUNT(art_s2.art_id) as articles_s2
, COUNT(art_s3.art_id) as articles_s3
FROM tbl_theme
LEFT JOIN tbl_thm_connection AS con_s1 ON con_s1.con_thm_id = thm_id
LEFT JOIN tbl_article AS art_s1 ON art_s1.art_id = con_s1.con_art_id AND art_s1.art_state = 'A'
LEFT JOIN tbl_thm_connection AS con_s2 ON con_s2.con_thm_id = thm_id
LEFT JOIN tbl_article AS art_s2 ON art_s2.art_id = con_s2.con_art_id AND art_s2.art_state = 'B'
LEFT JOIN tbl_thm_connection AS con_s3 ON con_s3.con_thm_id = thm_id
LEFT JOIN tbl_article AS art_s3 ON art_s3.art_id = con_s3.con_art_id AND art_s3.art_state = 'C'
GROUP BY thm_id |
Heeft iemand enig idee hoe ik dit het beste kan aanpakken ?
Alvast bedankt!
(Database is MySQL 4.0.15, dus subqueries zijn niet mogelijk)
In werkelijkheid is de tabellenstructuur een stuk uitgebreider maar om het probleem te lokaliseren heb ik het tot de kern teruggebracht
Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."