Ok, ik zal uit proberen te leggen wat ik van plan ben te maken door gebruik te maken van een Mysql database. Mijn voornemen is om een mysql systeem te ontwikkelen die misschien wat wel heeft van 'organische' trekjes.
Laat ik beginnen met de hoofstructuur van het alles. Het geheel is wat complexer, dus ik zou het eenfoudig houden. Neem aan dat ik vier verschillende soorten gegevens heb in vier verschillende tabellen. De tabellen noem ik A, B, C en D. Elke tabel bestaat uit een identificatienummer en de tekst van de gegevens. Ik heb dus vier tabellen (A t/m D) met velden (A-ID t/m D-ID) en tekst (A-TEXT t/m D-TEXT).
Het idee is nu dat deze tabellen dynamisch aan elkaar gelinkt kunnen worden. Hiervoor heb ik tussen elke tabel een nieuwe tabel staan die de geldige combinaties aangeeft tussen deze twee tabellen. De 'geldige combinaties tabellen' zijn: AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB EN DC.
In tabel A t/m D voeg ik allemaal twee een records toe:
Neem aan dat ik de volgende 'geldige combinaties' toevoeg:
Vervolgens moeten de zaken aan elkaar 'gekoppeld' worden. Begin ik met een selectie op tabel A.
Vervolgens moet ik de zaken gekoppeld worden maar wel met een check of de join mag zegmaar. Hier kom ik niet uit, dit omdat ik in een join WHERE condities moet toevoegen van tabellen die nog helemaal niet bestaan. Dus ik denk dat ik moet werken met een groot aantal subquery's in een JOIN, maar gaat dat wel.
Het moet er zoiets uit gaan zien, maar dit kan op deze manier niet, hopelijk wordt middels deze query wel duidelijk wat ik wil bereiken:
en dan ook op de C, D tabellen.
Samengevat moet het zoiets worden:
Zoals je ziet word de tabel gekoppeld middels de 'geldige combinatie'-tabellen. Alleen kom ik er niet uit hoe dit het beste aan te pakken. Ik heb verschillende manieren geprobeerd middels subquery's in de JOIN, maar ik kom telkens terug dat ik geen relatie kan krijgen met de bestaande data, of met dubbele tabellen of niet bestaande tabellen. Kortgezegd weet ik niet waar ik moet beginnen en vanuit welke invalshoek ik dit moet benaderen
Laat ik beginnen met de hoofstructuur van het alles. Het geheel is wat complexer, dus ik zou het eenfoudig houden. Neem aan dat ik vier verschillende soorten gegevens heb in vier verschillende tabellen. De tabellen noem ik A, B, C en D. Elke tabel bestaat uit een identificatienummer en de tekst van de gegevens. Ik heb dus vier tabellen (A t/m D) met velden (A-ID t/m D-ID) en tekst (A-TEXT t/m D-TEXT).
SQL:
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
| CREATE TABLE IF NOT EXISTS `A` ( `AID` int(11) unsigned NOT NULL, `A` char(11) NOT NULL, PRIMARY KEY (`AID`), UNIQUE KEY `A` (`A`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `B` ( `BID` int(11) NOT NULL, `B` char(11) NOT NULL, PRIMARY KEY (`BID`), UNIQUE KEY `B` (`B`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `C` ( `CID` int(11) NOT NULL, `C` char(11) NOT NULL, PRIMARY KEY (`CID`), UNIQUE KEY `C` (`C`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `D` ( `DID` int(11) NOT NULL, `D` char(11) NOT NULL, PRIMARY KEY (`DID`), UNIQUE KEY `D` (`D`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
Het idee is nu dat deze tabellen dynamisch aan elkaar gelinkt kunnen worden. Hiervoor heb ik tussen elke tabel een nieuwe tabel staan die de geldige combinaties aangeeft tussen deze twee tabellen. De 'geldige combinaties tabellen' zijn: AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB EN DC.
SQL:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| CREATE TABLE IF NOT EXISTS `AB` ( `AID` int(11) NOT NULL, `BID` int(11) NOT NULL, UNIQUE KEY `AID` (`AID`,`BID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `AC` ( `AID` int(11) NOT NULL, `CID` int(11) NOT NULL, UNIQUE KEY `AID` (`AID`,`CID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `AD` ( `AID` int(11) NOT NULL, `DID` int(11) NOT NULL, UNIQUE KEY `AID` (`AID`,`DID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `BA` ( `BID` int(11) NOT NULL, `AID` int(11) NOT NULL, UNIQUE KEY `BID` (`BID`,`AID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `BC` ( `BID` int(11) NOT NULL, `CID` int(11) NOT NULL, UNIQUE KEY `BID` (`BID`,`CID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `BD` ( `BID` int(11) NOT NULL, `DID` int(11) NOT NULL, UNIQUE KEY `BID` (`BID`,`DID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `CA` ( `CID` int(11) NOT NULL, `AID` int(11) NOT NULL, UNIQUE KEY `CID` (`CID`,`AID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `CB` ( `CID` int(11) NOT NULL, `BID` int(11) NOT NULL, UNIQUE KEY `CID` (`CID`,`BID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `CD` ( `CID` int(11) NOT NULL, `DID` int(11) NOT NULL, UNIQUE KEY `CID` (`CID`,`DID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `DA` ( `DID` int(11) NOT NULL, `AID` int(11) NOT NULL, UNIQUE KEY `DID` (`DID`,`AID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `DB` ( `DID` int(11) NOT NULL, `BID` int(11) NOT NULL, UNIQUE KEY `DID` (`DID`,`BID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `DC` ( `DID` int(11) NOT NULL, `CID` int(11) NOT NULL, UNIQUE KEY `DID` (`DID`,`CID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
In tabel A t/m D voeg ik allemaal twee een records toe:
SQL:
1
2
3
4
5
6
7
8
| INSERT INTO `A` (`A-ID`,`A-TEXT`) VALUES (1,'eerste in A'); INSERT INTO `A` (`A-ID`,`A-TEXT`) VALUES (2,'tweede in A'); INSERT INTO `B` (`B-ID`,`B-TEXT`) VALUES (1,'eerste in B'); INSERT INTO `B` (`B-ID`,`B-TEXT`) VALUES (2,'tweede in B'); INSERT INTO `C` (`C-ID`,`C-TEXT`) VALUES (1,'eerste in C'); INSERT INTO `C` (`C-ID`,`C-TEXT`) VALUES (2,'tweede in C'); INSERT INTO `D` (`D-ID`,`D-TEXT`) VALUES (1,'eerste in D'); INSERT INTO `D` (`D-ID`,`D-TEXT`) VALUES (2,'tweede in D'); |
Neem aan dat ik de volgende 'geldige combinaties' toevoeg:
SQL:
1
2
3
4
5
| INSERT INTO `AB` (`A-ID`,`B-ID`) VALUES (1,1); INSERT INTO `BC` (`B-ID`,`C-ID`) VALUES (1,1); INSERT INTO `CA` (`C-ID`,`A-ID`) VALUES (1,2); INSERT INTO `DB` (`D-ID`,`B-ID`) VALUES (1,1); INSERT INTO `DC` (`D-ID`,`C-ID`) VALUES (1,2); |
Vervolgens moeten de zaken aan elkaar 'gekoppeld' worden. Begin ik met een selectie op tabel A.
SQL:
1
| SELECT * FROM A |
Vervolgens moet ik de zaken gekoppeld worden maar wel met een check of de join mag zegmaar. Hier kom ik niet uit, dit omdat ik in een join WHERE condities moet toevoegen van tabellen die nog helemaal niet bestaan. Dus ik denk dat ik moet werken met een groot aantal subquery's in een JOIN, maar gaat dat wel.
Het moet er zoiets uit gaan zien, maar dit kan op deze manier niet, hopelijk wordt middels deze query wel duidelijk wat ik wil bereiken:
SQL:
1
2
3
4
5
6
7
| LEFT JOIN `B` WHERE (`B`.`B-ID` = `AB`.`B-ID` AND `AB`.`A-ID` = `A`.`A-ID`) OR (`B`.`B-ID` = `BA`.`B-ID` AND `BA`.`A-ID` = `A`.`A-ID`) OR (`B`.`B-ID` = `BC`.`B-ID` AND `BC`.`C-ID` = `C`.`C-ID`) OR (`B`.`B-ID` = `CB`.`B-ID` AND `CB`.`C-ID` = `C`.`C-ID`) OR (`B`.`B-ID` = `BD`.`B-ID` AND `BD`.`D-ID` = `D`.`D-ID`) OR (`B`.`B-ID` = `DB`.`B-ID` AND `DB`.`D-ID` = `D`.`D-ID`) |
en dan ook op de C, D tabellen.
Samengevat moet het zoiets worden:
SQL:
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
32
33
34
35
36
| SELECT * FROM [???] LEFT JOIN `A` WHERE (`A`.`A-ID` = `AB`.`A-ID` AND `AB`.`B-ID` = `B`.`B-ID`) OR (`A`.`A-ID` = `AC`.`A-ID` AND `AC`.`C-ID` = `C`.`C-ID`) OR (`A`.`A-ID` = `AD`.`A-ID` AND `AD`.`D-ID` = `D`.`D-ID`) OR (`A`.`A-ID` = `BA`.`A-ID` AND `BA`.`B-ID` = `B`.`B-ID`) OR (`A`.`A-ID` = `CA`.`A-ID` AND `CA`.`C-ID` = `C`.`C-ID`) OR (`A`.`A-ID` = `DA`.`A-ID` AND `DA`.`D-ID` = `D`.`D-ID`) LEFT JOIN `B` WHERE (`B`.`B-ID` = `BA`.`B-ID` AND `BA`.`A-ID` = `A`.`A-ID`) OR (`B`.`B-ID` = `BC`.`B-ID` AND `BC`.`C-ID` = `C`.`C-ID`) OR (`B`.`B-ID` = `BD`.`B-ID` AND `BD`.`D-ID` = `D`.`D-ID`) OR (`B`.`B-ID` = `AB`.`B-ID` AND `AB`.`A-ID` = `A`.`A-ID`) OR (`B`.`B-ID` = `CB`.`B-ID` AND `CB`.`C-ID` = `C`.`C-ID`) OR (`B`.`B-ID` = `DB`.`B-ID` AND `DB`.`D-ID` = `D`.`D-ID`) LEFT JOIN `C` WHERE (`C`.`C-ID` = `CA`.`C-ID` AND `BA`.`A-ID` = `A`.`A-ID`) OR (`C`.`C-ID` = `CB`.`C-ID` AND `CB`.`B-ID` = `B`.`B-ID`) OR (`C`.`C-ID` = `CD`.`C-ID` AND `BD`.`D-ID` = `D`.`D-ID`) OR (`C`.`C-ID` = `AC`.`C-ID` AND `AB`.`A-ID` = `A`.`A-ID`) OR (`C`.`C-ID` = `BC`.`C-ID` AND `BC`.`B-ID` = `B`.`B-ID`) OR (`C`.`C-ID` = `DC`.`C-ID` AND `DB`.`D-ID` = `D`.`D-ID`) LEFT JOIN `D` WHERE (`C`.`D-ID` = `DA`.`D-ID` AND `BA`.`A-ID` = `A`.`A-ID`) OR (`C`.`D-ID` = `DB`.`D-ID` AND `CB`.`B-ID` = `B`.`B-ID`) OR (`C`.`D-ID` = `CD`.`D-ID` AND `CD`.`C-ID` = `C`.`C-ID`) OR (`C`.`D-ID` = `AD`.`D-ID` AND `AB`.`A-ID` = `A`.`A-ID`) OR (`C`.`D-ID` = `BD`.`D-ID` AND `BC`.`B-ID` = `B`.`B-ID`) OR (`C`.`D-ID` = `DC`.`D-ID` AND `DC`.`C-ID` = `C`.`C-ID`) ORDER BY RAND() LIMIT 10 |
Zoals je ziet word de tabel gekoppeld middels de 'geldige combinatie'-tabellen. Alleen kom ik er niet uit hoe dit het beste aan te pakken. Ik heb verschillende manieren geprobeerd middels subquery's in de JOIN, maar ik kom telkens terug dat ik geen relatie kan krijgen met de bestaande data, of met dubbele tabellen of niet bestaande tabellen. Kortgezegd weet ik niet waar ik moet beginnen en vanuit welke invalshoek ik dit moet benaderen



