Mysql query probleem
En kan ik die dan JOINEN? Of zie ik dat hier verkeerd en is dat niet meer nodig? Ik heb geen idee hoe je dit zou aanpakken.
@Brecht, als je nu dan vertelt wat je wilt als er meer projecten of taken zijn... dan kunnen we je misschien helpen.
Je zei dat je taak_id nodig had, dus dan heb je ook meerdere records nodig lijkt me.
Je zei dat je taak_id nodig had, dus dan heb je ook meerdere records nodig lijkt me.
Wat ik zie is dat er maar 2 personen meerdere keren voorkomen en die hebben toevallig ook een project met meerdere taken onder. Dus daar gaat precies iets verkeerd. Diegene die geen projecten (of taken) hebben komen maar 1 keer voor wat dus juist is en dat zijn de overige in de lijst.
Als er meerdere projecten of projecttaken zijn mag die persoon maar 1 keer verschijnen want er is bvb maar 1 todo aan gekoppeld. Voor alle duidelijkheid: we spreken hier over taken maar dit zijn projecttaken. In het overzicht dat ik wil maken gaat het hier enkel over todo's voor bepaalde personen ( en die hangen vast aan contacten ). Dat ik hier een mix moet hebben met projecten en projecttaken heeft hier eigenlijk rechtstreeks niks mee te zien. Dit is alleen omdat ik die taak_id nodig heb om de taak later te kunnen aanpassen vanuit die overzichtlijst.
Als er meerdere projecten of projecttaken zijn mag die persoon maar 1 keer verschijnen want er is bvb maar 1 todo aan gekoppeld. Voor alle duidelijkheid: we spreken hier over taken maar dit zijn projecttaken. In het overzicht dat ik wil maken gaat het hier enkel over todo's voor bepaalde personen ( en die hangen vast aan contacten ). Dat ik hier een mix moet hebben met projecten en projecttaken heeft hier eigenlijk rechtstreeks niks mee te zien. Dit is alleen omdat ik die taak_id nodig heb om de taak later te kunnen aanpassen vanuit die overzichtlijst.
Gewijzigd op 13/01/2015 21:19:13 door Brecht S
Degene die geen projecten of taken hebben komen inderdaad maar 1 keer voor, maar hebben dan geen taak_id. (taak_id heeft waarde NULL).
Van diegene die meerdere projecten en/of taken hebben zie je meer taak_ids in de overzichtslijst.
Welke van die taak_ids moet er dan getoond worden? Is er nog een extra conditie die je toe kunt passen om er maar 1 te zien?
Van diegene die meerdere projecten en/of taken hebben zie je meer taak_ids in de overzichtslijst.
Welke van die taak_ids moet er dan getoond worden? Is er nog een extra conditie die je toe kunt passen om er maar 1 te zien?
Gewijzigd op 13/01/2015 21:20:48 door Jan de Laet
Ik zal proberen al mijn uitleg hier eens opnieuw van in het begin te verduidelijken want denk dat jullie niet meer mee zijn. Het is ook een heel complex iets.
Ik heb een pagina genaamd 'historiek'. Hier kan je een type kiezen: notitie, todo of taak. Afhankelijk van wat je kiest krijg je andere velden te zien.
In het geval het een notitie is komt die in een lijst te staan die alle callcenters kunnen zien om meer te weten te komen over die prospect/klant. Dus eigenlijk een echte historiek/logboek.
In het geval het een todo is moet die op een andere pagina 'activiteiten' verschijnen (en daar gaat het hier over). Hier hebben we een lijst met alle items die als todo zijn opgegeven met telkens een actiedatum waarop die in de lijst moet verschijnen.
In het geval het een taak is moet die op de pagina 'activiteiten' in de lijst verschijnen. Ook hier is de actiedatum de datum van verschijning. Maar ook moet die op een andere pagina 'projecten' verschijnen onder een project die hangt aan die klant.
Indien dus een taak is opgegeven als type in die pagina historiek verschijnt er ook een knopje bij waar je kan op klikken om naar de aanpaspagina te gaan van die taak. Vandaar heb ik die taak_id nodig.
Misschien is deze uitleg beter?
Toevoeging op 13/01/2015 21:30:37:
@Jan: inderdaad, van diegenen die meerdere projecten/taken hebben zie je ze ook meerdere keren verschijnen. Het gaat hier enkel over de taak_id die als historiek item is opgemaakt met als type 'taak'. In de meeste gevallen zal dit maar 1 taak_id zijn. Misschien is hier nog een extra iets nodig dat ik check of type = taak bij de historiek (met h.type = 'taak') en zo de bijhorende id krijg en dit dus ook de enige is die verschijnt?
Ik heb een pagina genaamd 'historiek'. Hier kan je een type kiezen: notitie, todo of taak. Afhankelijk van wat je kiest krijg je andere velden te zien.
In het geval het een notitie is komt die in een lijst te staan die alle callcenters kunnen zien om meer te weten te komen over die prospect/klant. Dus eigenlijk een echte historiek/logboek.
In het geval het een todo is moet die op een andere pagina 'activiteiten' verschijnen (en daar gaat het hier over). Hier hebben we een lijst met alle items die als todo zijn opgegeven met telkens een actiedatum waarop die in de lijst moet verschijnen.
In het geval het een taak is moet die op de pagina 'activiteiten' in de lijst verschijnen. Ook hier is de actiedatum de datum van verschijning. Maar ook moet die op een andere pagina 'projecten' verschijnen onder een project die hangt aan die klant.
Indien dus een taak is opgegeven als type in die pagina historiek verschijnt er ook een knopje bij waar je kan op klikken om naar de aanpaspagina te gaan van die taak. Vandaar heb ik die taak_id nodig.
Misschien is deze uitleg beter?
Toevoeging op 13/01/2015 21:30:37:
@Jan: inderdaad, van diegenen die meerdere projecten/taken hebben zie je ze ook meerdere keren verschijnen. Het gaat hier enkel over de taak_id die als historiek item is opgemaakt met als type 'taak'. In de meeste gevallen zal dit maar 1 taak_id zijn. Misschien is hier nog een extra iets nodig dat ik check of type = taak bij de historiek (met h.type = 'taak') en zo de bijhorende id krijg en dit dus ook de enige is die verschijnt?
Gewijzigd op 13/01/2015 21:39:15 door Brecht S
Na je uitleg begrijp ik de relatie tussen historiek en projecten / taken nog niet helemaal.
- Type 'notitie' hebben geen relatie naar projecten en taken
- Type 'todo' heeft activiteit, maar het is mij niet duidelijk of hier relatie is met projecten / taken (hoe koppel je een todo aan een project en aan een taak?)
- Type 'taak' heeft ook activiteit, ook hier de vraag: wat is de relatie.
Projecten lijken alleen aan een contact te hangen (contact_id), of is er ook nog relatie met historiek?
Kun je bij de JOIN naar taken bij de ON toevoegen AND h.type=t.type? Zijn type in historiek en taken ook 'todo' of 'taak'?
- Type 'notitie' hebben geen relatie naar projecten en taken
- Type 'todo' heeft activiteit, maar het is mij niet duidelijk of hier relatie is met projecten / taken (hoe koppel je een todo aan een project en aan een taak?)
- Type 'taak' heeft ook activiteit, ook hier de vraag: wat is de relatie.
Projecten lijken alleen aan een contact te hangen (contact_id), of is er ook nog relatie met historiek?
Kun je bij de JOIN naar taken bij de ON toevoegen AND h.type=t.type? Zijn type in historiek en taken ook 'todo' of 'taak'?
- Type notitie heeft inderdaad geen relatie naar projecten en taken.
- Type todo heeft ook geen relatie met projecten/taken. Is enkel maar om in de overzichtlijst te laten verschijnen van de activiteiten of agendapunten die iemand moet doen op een bepaalde dag. Je kan het best met een agenda vergelijken met todo's in.
- Type taak is dan ook de enige die wel iets met projecten/taken te maken heeft. Die komen als 'agendapunt' in de activiteitenlijst naar boven op de actiedatum en moeten ook als todo 'afgewerkt' worden.
De relatie tussen de historiek en de taken zit hem in het type. Dus je redenering van h.type = t.type in een AND toe te voegen aan de ON bij taken lost mijn probleem hier op. Ik krijg nu de juiste lijst te zien die ik nodig had.
Projecten of (project)taken hangen inderdaad enkel maar aan contacten en (project)taken zitten ook altijd onder een project. De enige relatie die het heeft met historiek is het type omdat je dus ook een projecttaak kan maken vanuit die historiek door het type op 'taak' te zetten daar. Uiteraard moet je dan ook een project selecteren, maar dit was al opgelost.
Mijn nieuwe query is nu:
Als ik nu $row['tid'] wil oproepen, blijft die leeg. Hoe zou dat komen?
- Type todo heeft ook geen relatie met projecten/taken. Is enkel maar om in de overzichtlijst te laten verschijnen van de activiteiten of agendapunten die iemand moet doen op een bepaalde dag. Je kan het best met een agenda vergelijken met todo's in.
- Type taak is dan ook de enige die wel iets met projecten/taken te maken heeft. Die komen als 'agendapunt' in de activiteitenlijst naar boven op de actiedatum en moeten ook als todo 'afgewerkt' worden.
De relatie tussen de historiek en de taken zit hem in het type. Dus je redenering van h.type = t.type in een AND toe te voegen aan de ON bij taken lost mijn probleem hier op. Ik krijg nu de juiste lijst te zien die ik nodig had.
Projecten of (project)taken hangen inderdaad enkel maar aan contacten en (project)taken zitten ook altijd onder een project. De enige relatie die het heeft met historiek is het type omdat je dus ook een projecttaak kan maken vanuit die historiek door het type op 'taak' te zetten daar. Uiteraard moet je dan ook een project selecteren, maar dit was al opgelost.
Mijn nieuwe query is nu:
Code (php)
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
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
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 OUTER JOIN
projecten p
ON
p.contact_id = c.id
LEFT OUTER JOIN
taken t
ON
t.project_id = p.id AND h.type = t.type
WHERE
h.actiedatum <= CURRENT_DATE AND h.afgewerkt <> 'ja' AND h.actiedatum <> '0000-00-00'
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 OUTER JOIN
projecten p
ON
p.contact_id = c.id
LEFT OUTER JOIN
taken t
ON
t.project_id = p.id AND h.type = t.type
WHERE
h.actiedatum <= CURRENT_DATE AND h.afgewerkt <> 'ja' AND h.actiedatum <> '0000-00-00'
Als ik nu $row['tid'] wil oproepen, blijft die leeg. Hoe zou dat komen?
Wie weet.
Aan dat antwoord heb ik wel niet veel hé, Ger...
tid krijgt alleen een waarde als:
- het contact een project heeft en
- project een taak heeft en
- type uit historiek en taak gelijk zijn aan elkaar.
Voor de meeste rijen kun je dus een lege tid krijgen.
- het contact een project heeft en
- project een taak heeft en
- type uit historiek en taak gelijk zijn aan elkaar.
Voor de meeste rijen kun je dus een lege tid krijgen.
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.
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?
Toevoeging op 15/01/2015 11:25:00:
Denk dat hier momenteel het probleem zit...
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?
Toevoeging op 15/01/2015 11:25:00:
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...
Gewijzigd op 15/01/2015 11:28:43 door Brecht S
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:
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:
Code (php)
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
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
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'
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'
Gewijzigd op 15/01/2015 12:04:09 door Ger van Steenderen
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!




