Het probleem:
Ik heb een tabel ActieLijst, waar records in kunnen bestaan met gewoon wat tekst en waar records in kunnen bestaan met een verwijzing naar een andere tabel. Op dit moment zijn dat er nog maar 2 maar dat kunnen er eventueel meer worden. Ik heb die verwijzing opgelost door twee velden op te nemen: TableName en TableID - dat levert opzich geen probleem op met joinen
In de huidige situatie kan het zijn dat er een verwijzing is naar de opdrachten tabel of de rbs tabel. Geen punt. Alleen nu komt het: de rbs tabel is een vrij belangrijke omdat daar bedrijfsinformatie in staat. De opdrachten tabel moet naar deze tabel kijken om dingen als bedrijfsnaam te weten te komen - dit wordt uiteraard gedaan dmv 1 veld die met de PK uit de rbs tabel overeenkomt.
Probleem: Ik wil met 1 query de volgende informatie:
- alles uit de ActieLijst tabel
- id en functie uit de opdrachten tabel als de TableName op opdracht staat
- id en reden uit de rbs tabel als de TableName op rbs staat
- een bedrijfsnaam als TableName op opdracht of rbs staat,
Het punt is dat ik in het geval van een rbs-verwijzing gelijk de bedrijfsnaam zou kunnen benaderen, maar in een opdrachten geval niet. Dan moet ik ook de rbs-tabel er nog eens op joinen.
Ik ben tot deze query gekomen:
hiermee:
IF(o.bedrijfs_id, o.bedrijfs_id, rbs.id) AS bedrijfs_id
zorg ik er voor dat als er een bedrijfs_id in 1 van beide tabellen bekend is, dat deze onder de alias bedrijfs_id bekend is. En die alias gebruik ik later dan weer om de rbs tabel op je joinen (LEFT JOIN rbs AS b ON b.id = bedrijfs_id)
Ik vind het zelf ook een beetje gekunstel, maar het is de enige manier omdat ik geen subqueries kan gebruiken.
Het gekke is alleen, dat dit in het geval van een opdracht wel goed gaat en in het geval van een rbs niet. Als er een opdracht in staat dan krijg ik netjes een bedrijfsnaam daarbij en in het geval van een rbs blijft ie leeg (er wordt dus niets gejoined). Dat is zeer vreemd, want in m'n resultset heeft bedrijfs_id wel een getal in beide gevallen. Als ik dat getal (bedrijfs_id) hard inklop in m'n query (dus LEFT JOIN rbs AS b ON b.id = 1234) dan blijkt ie 'm wél gewoon te pakken. Op 1 of andere manier gaat er dus iets fout bij de 'rbs-records' : bedrijfs_id heeft wel de juiste waarde, maar toch gebruikt ie die waarde niet om te joinen - terwijl dit op exact dezelfde wijze bij een 'opdracht-record' wel goed gaat.
Ik hoop dat het duidelijk is, het is een beetje vaag probleem
en hoop ook dat iemand een oplossing weet
Ik heb een tabel ActieLijst, waar records in kunnen bestaan met gewoon wat tekst en waar records in kunnen bestaan met een verwijzing naar een andere tabel. Op dit moment zijn dat er nog maar 2 maar dat kunnen er eventueel meer worden. Ik heb die verwijzing opgelost door twee velden op te nemen: TableName en TableID - dat levert opzich geen probleem op met joinen
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| CREATE TABLE ActieLijst ( ActieLijstID bigint(20) unsigned NOT NULL auto_increment, UserID int(11) unsigned NOT NULL default '0', TableID int(10) unsigned default NULL, TableName enum('opdrachten','rbs') default NULL, Title varchar(255) default NULL, Body text, EventDate date default NULL, EventStatus enum('','done','deleted') NOT NULL default '', Warning datetime default NULL, Added datetime default NULL, Edited timestamp(14) NOT NULL, Moved text, PRIMARY KEY (ActieLijstID), UNIQUE KEY ActieLijstID (ActieLijstID), KEY UserID (UserID), KEY TableID (TableID) ) TYPE=MyISAM; |
In de huidige situatie kan het zijn dat er een verwijzing is naar de opdrachten tabel of de rbs tabel. Geen punt. Alleen nu komt het: de rbs tabel is een vrij belangrijke omdat daar bedrijfsinformatie in staat. De opdrachten tabel moet naar deze tabel kijken om dingen als bedrijfsnaam te weten te komen - dit wordt uiteraard gedaan dmv 1 veld die met de PK uit de rbs tabel overeenkomt.
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # alleen relevante velden CREATE TABLE opdrachten ( id bigint(20) unsigned NOT NULL auto_increment, bedrijfs_id bigint(20) unsigned default NULL, functie varchar(250) default NULL, PRIMARY KEY (id), KEY obid (bedrijfs_id), ) TYPE=MyISAM; CREATE TABLE rbs ( id bigint(20) unsigned NOT NULL auto_increment, bedrijfsnaam varchar(100) NOT NULL default '', reden varchar(255) default NULL, PRIMARY KEY (id), ) TYPE=MyISAM; |
Probleem: Ik wil met 1 query de volgende informatie:
- alles uit de ActieLijst tabel
- id en functie uit de opdrachten tabel als de TableName op opdracht staat
- id en reden uit de rbs tabel als de TableName op rbs staat
- een bedrijfsnaam als TableName op opdracht of rbs staat,
Het punt is dat ik in het geval van een rbs-verwijzing gelijk de bedrijfsnaam zou kunnen benaderen, maar in een opdrachten geval niet. Dan moet ik ook de rbs-tabel er nog eens op joinen.
Ik ben tot deze query gekomen:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| SELECT AL.*, DATE_FORMAT(EventDate, '%d-%m-%Y') AS Date, IF(o.bedrijfs_id, o.bedrijfs_id, rbs.id) AS bedrijfs_id, o.id AS oid, o.functie, b.id AS bid, b.bedrijfsnaam, rbs.reden FROM ActieLijst AS AL LEFT JOIN opdrachten AS o ON o.id = AL.TableID AND AL.TableName='opdrachten' LEFT JOIN rbs ON rbs.id = AL.TableID AND AL.TableName='rbs' LEFT JOIN rbs AS b ON b.id = bedrijfs_id WHERE UserID = 15 AND EventStatus != 'deleted' AND EventDate='2004-05-10' |
hiermee:
IF(o.bedrijfs_id, o.bedrijfs_id, rbs.id) AS bedrijfs_id
zorg ik er voor dat als er een bedrijfs_id in 1 van beide tabellen bekend is, dat deze onder de alias bedrijfs_id bekend is. En die alias gebruik ik later dan weer om de rbs tabel op je joinen (LEFT JOIN rbs AS b ON b.id = bedrijfs_id)
Ik vind het zelf ook een beetje gekunstel, maar het is de enige manier omdat ik geen subqueries kan gebruiken.
Het gekke is alleen, dat dit in het geval van een opdracht wel goed gaat en in het geval van een rbs niet. Als er een opdracht in staat dan krijg ik netjes een bedrijfsnaam daarbij en in het geval van een rbs blijft ie leeg (er wordt dus niets gejoined). Dat is zeer vreemd, want in m'n resultset heeft bedrijfs_id wel een getal in beide gevallen. Als ik dat getal (bedrijfs_id) hard inklop in m'n query (dus LEFT JOIN rbs AS b ON b.id = 1234) dan blijkt ie 'm wél gewoon te pakken. Op 1 of andere manier gaat er dus iets fout bij de 'rbs-records' : bedrijfs_id heeft wel de juiste waarde, maar toch gebruikt ie die waarde niet om te joinen - terwijl dit op exact dezelfde wijze bij een 'opdracht-record' wel goed gaat.
Ik hoop dat het duidelijk is, het is een beetje vaag probleem
en hoop ook dat iemand een oplossing weet