Ik heb hier 3 tabellen:

contacten
historiek
taken

De relatie tussen de contacten en historiek is de historiek.contact_id die gelijk is aan de contacten.id tabel. Maar er is geen relatie tussen de contacten en taken tabel of tussen de historiek en taken tabel. Toch zou ik deze in de query willen opnemen omdat ik van de taken het id zou nodig hebben.
De query zou er als volgt moeten uitzien:

		            SELECT 
		                h.actiedatum,
				h.contact_id,
				h.historiek,
				h.id,
				h.type,
				c.bedrijfsnaam,
				c.voornaam,
				c.achternaam,
                                t.id
			    FROM 
				historiek h
			    JOIN
				contacten c
			    ON
				h.contact_id = c.id
                            JOIN
                                taken t
                            ON
                                ???
			    WHERE 
				actiedatum <= CURRENT_DATE AND afgewerkt <> 'ja' AND actiedatum <> '0000-00-00' AND naam = '". $_SESSION['username'] ."'


Maar wat moet op de ??? komen? Of heb ik die ON niet altijd nodig?
Het punt is dat hier een poging gedaan wordt om twee totaal verschillende queries in één query te gieten.
Dat kan wel maar het gevolg daarvan is dat je soort van cross join krijgt.
Stel dat contact 1 in de historiektabel x entries heeft en in de takentabel y entries, dan is het (logische) gevolg van de join x*y records.

Een relatie op een niet sleutel kolom is geen relatie (hooguit een one-night stand), je weet in de historiek tabel alleen dat het een taak is, maar niet welke taak.
Daardoor kan je wel de recordset verkleinen, maar blijf je nog steeds alle taken gekoppeld krijgen aan een record van het type "taak" in de historiektabel.

Conclusie: historiek en taken moeten in relatietherapie of je moet in PHP omgaan met de meerdere records.
@ Ger: Denk dat dit nu aan het gebeuren is, inderdaad. Ik had iets over het hoofd gezien gisteren. Het is zo dat indien h.type = t.type en er hangt een taak/taken (projectentaken) of een project/projecten aan dat contact (wat altijd zo zal zijn) dat ik dubbels krijg op dat contact en wel zoveel als er projecttaken zijn voor dat contact (op die moment werkt tid wel).
Kan je dat niet oplossen met een GROUP BY of ORDER BY? Wat zou hier de meest goede oplossing voor zijn. Kan je eens een duidelijk voorbeeld geven waarmee ik aan de slag kan?

[size=xsmall]Toevoeging op 15/01/2015 11:25:00:[/size]

Ger van Steenderen op 15/01/2015 11:03:10

je weet in de historiek tabel alleen dat het een taak is, maar niet welke taak.

Denk dat hier momenteel het probleem zit...
Dus toch relatietherapie, de therapeut is dan een extra tabel:
historiek_taken
- historiek_id (PK)
- taak_id

Op het moment dat je een historiek hebt op een bepaalde taak, sla je de beide id's op in de historiek_taken tabel.

De relatie tussen historiek en historiek_taken is dan 1 - 1/0, en dan doet het bijbehorende project niet meer terzake:

SELECT 
   h.actiedatum,
   h.contact_id,
   h.historiek,
   h.id as hid,
   h.type as htype,
   c.bedrijfsnaam,
   c.voornaam,
   c.achternaam,
   t.id as tid
FROM 
   historiek h
JOIN
   contacten c
ON
   h.contact_id = c.id
LEFT JOIN
   historiek_taken ht
ON
   h.id = ht.historiek_id
LEFT JOIN
   taken t
ON
   ht.taak_id = t.id
WHERE 
   h.actiedatum <= CURRENT_DATE AND h.afgewerkt <> 'ja' AND h.actiedatum <> '0000-00-00'



Schitterend Ger... Denk dat het is gelukt op jouw manier. Maar moet nog een paar testen uitvoeren om zeker te zijn. Op het eerste zicht lijkt het prima! Thanks!

Reageren