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.
Je zei dat je taak_id nodig had, dus dan heb je ook meerdere records nodig lijkt me.
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
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 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
- 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 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...
- 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.
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.
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
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!