Mysql query probleem
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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'] ."'
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?
Iedere rij uit taken zal dan gekoppeld worden aan iedere rij van contacten en historiek.
Ik betwijfel of dat zinvol is.
Als er geen relatie is, kun je geen verbanden leggen en dus die JOIN nooit goed invullen.
Laat eens de definities van de drie tabellen zien?
@Ward: Nee dacht ik ook al. Wat bedoel je met de definities van de 3 tabellen?
Dat kun je zien als je de tabel bijvoorbeeld exporteert of een back-up maakt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--
-- Tabelstructuur voor tabel `historiek`
--
CREATE TABLE IF NOT EXISTS `historiek` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`datum` varchar(50) NOT NULL,
`naam` varchar(100) NOT NULL,
`historiek` longtext NOT NULL,
`contact_id` varchar(5) NOT NULL,
`file` varchar(100) NOT NULL,
`file_ext` varchar(4) NOT NULL,
`actiedatum` date DEFAULT NULL,
`afgewerkt` varchar(10) NOT NULL,
`type` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=466 ;
-- Tabelstructuur voor tabel `historiek`
--
CREATE TABLE IF NOT EXISTS `historiek` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`datum` varchar(50) NOT NULL,
`naam` varchar(100) NOT NULL,
`historiek` longtext NOT NULL,
`contact_id` varchar(5) NOT NULL,
`file` varchar(100) NOT NULL,
`file_ext` varchar(4) NOT NULL,
`actiedatum` date DEFAULT NULL,
`afgewerkt` varchar(10) NOT NULL,
`type` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=466 ;
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
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
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
--
-- Tabelstructuur voor tabel `contacten`
--
CREATE TABLE IF NOT EXISTS `contacten` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`terugbeldatum_vtw` varchar(150) NOT NULL,
`terugbeluur_vtw` varchar(150) NOT NULL,
`datum_ingave` varchar(50) NOT NULL,
`datum_gewijzigd` varchar(50) NOT NULL,
`datum_klant` varchar(50) NOT NULL,
`maand_klant` varchar(20) NOT NULL,
`bedrijfsnaam` varchar(100) NOT NULL,
`achternaam` varchar(100) NOT NULL,
`voornaam` varchar(50) NOT NULL,
`adres` varchar(100) NOT NULL,
`postcode` varchar(100) NOT NULL,
`gemeente` varchar(20000) NOT NULL,
`lat` float NOT NULL,
`lng` float NOT NULL,
`cont_status` varchar(20) NOT NULL,
`afsp_status` varchar(20) NOT NULL,
`mobiel` varchar(50) NOT NULL,
`telefoon` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,
`functie` varchar(150) NOT NULL,
`website` varchar(100) NOT NULL,
`opmerkingen` varchar(20000) NOT NULL,
`opmerkingen_klant` varchar(20000) NOT NULL,
`vertegenwoordiger` varchar(50) NOT NULL,
`prospecteur` varchar(50) NOT NULL,
`terugbeldatum` varchar(50) NOT NULL,
`convert_terugbeldatum` varchar(50) NOT NULL,
`terugbeluur` varchar(20) NOT NULL,
`link` varchar(150) NOT NULL,
`subaccount` varchar(10) NOT NULL,
`vip` varchar(10) NOT NULL,
`sectornaam` varchar(350) NOT NULL,
`fact_naam` varchar(255) NOT NULL,
`fact_tav` varchar(255) NOT NULL,
`fact_venvorm` varchar(20) NOT NULL,
`fact_adres` varchar(255) NOT NULL,
`fact_postcode` varchar(20) NOT NULL,
`fact_gemeente` varchar(100) NOT NULL,
`fact_btwnr` varchar(50) NOT NULL,
`fact_email` varchar(255) NOT NULL,
`per_voorschot` varchar(10) NOT NULL,
`per_tussentijds` varchar(10) NOT NULL,
`per_slot` varchar(10) NOT NULL,
`photo` varchar(255) NOT NULL,
`uitdaging` longtext NOT NULL,
`bucket` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1205 ;
-- Tabelstructuur voor tabel `contacten`
--
CREATE TABLE IF NOT EXISTS `contacten` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`terugbeldatum_vtw` varchar(150) NOT NULL,
`terugbeluur_vtw` varchar(150) NOT NULL,
`datum_ingave` varchar(50) NOT NULL,
`datum_gewijzigd` varchar(50) NOT NULL,
`datum_klant` varchar(50) NOT NULL,
`maand_klant` varchar(20) NOT NULL,
`bedrijfsnaam` varchar(100) NOT NULL,
`achternaam` varchar(100) NOT NULL,
`voornaam` varchar(50) NOT NULL,
`adres` varchar(100) NOT NULL,
`postcode` varchar(100) NOT NULL,
`gemeente` varchar(20000) NOT NULL,
`lat` float NOT NULL,
`lng` float NOT NULL,
`cont_status` varchar(20) NOT NULL,
`afsp_status` varchar(20) NOT NULL,
`mobiel` varchar(50) NOT NULL,
`telefoon` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,
`functie` varchar(150) NOT NULL,
`website` varchar(100) NOT NULL,
`opmerkingen` varchar(20000) NOT NULL,
`opmerkingen_klant` varchar(20000) NOT NULL,
`vertegenwoordiger` varchar(50) NOT NULL,
`prospecteur` varchar(50) NOT NULL,
`terugbeldatum` varchar(50) NOT NULL,
`convert_terugbeldatum` varchar(50) NOT NULL,
`terugbeluur` varchar(20) NOT NULL,
`link` varchar(150) NOT NULL,
`subaccount` varchar(10) NOT NULL,
`vip` varchar(10) NOT NULL,
`sectornaam` varchar(350) NOT NULL,
`fact_naam` varchar(255) NOT NULL,
`fact_tav` varchar(255) NOT NULL,
`fact_venvorm` varchar(20) NOT NULL,
`fact_adres` varchar(255) NOT NULL,
`fact_postcode` varchar(20) NOT NULL,
`fact_gemeente` varchar(100) NOT NULL,
`fact_btwnr` varchar(50) NOT NULL,
`fact_email` varchar(255) NOT NULL,
`per_voorschot` varchar(10) NOT NULL,
`per_tussentijds` varchar(10) NOT NULL,
`per_slot` varchar(10) NOT NULL,
`photo` varchar(255) NOT NULL,
`uitdaging` longtext NOT NULL,
`bucket` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1205 ;
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--
-- Tabelstructuur voor tabel `taken`
--
CREATE TABLE IF NOT EXISTS `taken` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`project_id` varchar(50) NOT NULL,
`subproject_id` varchar(50) NOT NULL,
`toewijzen_id` varchar(50) NOT NULL,
`taak_naam` varchar(255) NOT NULL,
`status` varchar(100) NOT NULL,
`omschrijving` longtext NOT NULL,
`ges_tijd` varchar(100) NOT NULL,
`ges_budget` varchar(100) NOT NULL,
`wer_tijd` varchar(100) NOT NULL,
`wer_budget` varchar(100) NOT NULL,
`ges_startdatum` varchar(50) NOT NULL,
`wer_startdatum` varchar(50) NOT NULL,
`ges_einddatum` varchar(50) NOT NULL,
`wer_einddatum` varchar(50) NOT NULL,
`type` varchar(50) NOT NULL,
`regie` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=79 ;
-- Tabelstructuur voor tabel `taken`
--
CREATE TABLE IF NOT EXISTS `taken` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`project_id` varchar(50) NOT NULL,
`subproject_id` varchar(50) NOT NULL,
`toewijzen_id` varchar(50) NOT NULL,
`taak_naam` varchar(255) NOT NULL,
`status` varchar(100) NOT NULL,
`omschrijving` longtext NOT NULL,
`ges_tijd` varchar(100) NOT NULL,
`ges_budget` varchar(100) NOT NULL,
`wer_tijd` varchar(100) NOT NULL,
`wer_budget` varchar(100) NOT NULL,
`ges_startdatum` varchar(50) NOT NULL,
`wer_startdatum` varchar(50) NOT NULL,
`ges_einddatum` varchar(50) NOT NULL,
`wer_einddatum` varchar(50) NOT NULL,
`type` varchar(50) NOT NULL,
`regie` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=79 ;
Er ontbreekt dan, denk ik zo, in je query nog een bruggetje: je moet de tabel met projecten via de project_id relateren aan de contacten, anders zie je niet voor wie je wat doet.
Dat is ook zo. Maar die heb ik in deze query niet nodig. Of zie ik dit hier verkeerd?
Datum en tijden horen niet in een varchar.
Dat is ook zo. Maar die heb ik in deze query niet nodig. Of zie ik dit hier verkeerd?
Ja, je hebt via de projecten tabel een indirecte relatie tussen taken en contacten. Dus moet je die tabel gebruiken ook al gebruik je daar verder niets uit.
En let ook op de opmerking van San The.
Dus - SanThe - jouw punt is terecht maar is geen oplossing op mijn vraag hier ;-)
Toevoeging op 13/01/2015 17:34:07:
@Ger: moet ik dan een paar JOIN gebruiken in die query? Wat moet ik dan telkens bij de ON zetten? Dit is mij niet duidelijk. Zie hieronder tot waar ik het zie. De vraagtekens blijven het probleem:
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,
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
???
JOIN
projecten p
ON
???
WHERE
actiedatum <= CURRENT_DATE AND afgewerkt <> 'ja' AND actiedatum <> '0000-00-00' AND naam = '". $_SESSION['username'] ."'
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
???
JOIN
projecten p
ON
???
WHERE
actiedatum <= CURRENT_DATE AND afgewerkt <> 'ja' AND actiedatum <> '0000-00-00' AND naam = '". $_SESSION['username'] ."'
Je moet projecten zien als een soort van koppeltabel tussen contacten en taken, dus je joined eerst projecten aan contacten en dan taken aan projecten.
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
27
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
SELECT
h.actiedatum,
h.contact_id,
h.historiek,
h.id,
h.type,
c.bedrijfsnaam,
c.voornaam,
c.achternaam,
t.id as tid
FROM
historiek h
JOIN
contacten c
ON
h.contact_id = c.id
JOIN
projecten p
ON
p.contact_id = c.id
JOIN
taken t
ON
t.project_id = p.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,
h.type,
c.bedrijfsnaam,
c.voornaam,
c.achternaam,
t.id as tid
FROM
historiek h
JOIN
contacten c
ON
h.contact_id = c.id
JOIN
projecten p
ON
p.contact_id = c.id
JOIN
taken t
ON
t.project_id = p.id
WHERE
h.actiedatum <= CURRENT_DATE AND h.afgewerkt <> 'ja' AND h.actiedatum <> '0000-00-00'
";
Gewijzigd op 13/01/2015 20:09:12 door Brecht S
Je wilt iets met taak_id maar dit komt niet in de query voor.
Kortom, ben wat duidelijker in wat je precies wilt bereiken.
Gewijzigd op 13/01/2015 20:06:48 door Brecht S
Je zit op PHPhulp.nl en niet op vriendenvanjomanda.hz, dus geef voldoende en duidelijke informatie.
Dus voorbeeld gegevens en het uiteindelijke resultaat wat je eruit wilt hebben.
Ik had 22 resultaten en geen dubbele met de eerste query, nu met de nieuwe heb ik maar 14 records meer over en die bestaan uit maar 2 records meer die meerdere keren herhaald worden.
Toevoeging op 13/01/2015 20:24:34:
Misschien nog een extra woordje uitleg. Het betreft hier een overzicht pagina met alle activiteiten die iemand moet doen, een soort todo lijst. Die hangen ook vast aan een contactpersoon waar je iets moet mee doen, vandaar de link met de contacten zodat de naam van die persoon tevoorschijn komt ipv enkel maar een ID. In die historiek kan je kiezen of je een historiek item wilt maken als notitie, taak of todo. Als notitie komt die in een tabel, als todo in deze overzichtlijst en als taak ook in de overzichtlijst maar ook nog eens in de projectentool. Dit is enkel maar allemaal ter info / background informatie. Want hier is het enige doel die overzichtlijst te maken.
Een contact met meerdere projecten of projecten met meerdere taken zie je vaker.
Het 1e kun je oplossen door de JOIN naar projecten en de JOIN naar taken te vervangen door LEFT OUTER JOIN.
Met jouw aanpassing door te voeren zie ik nu meerdere juiste records verschijnen maar als er blijkbaar projecten aanwezig zijn (en dus ook taken) voor die bepaalde personen krijg ik die records dubbel en het aantal keren dat ze dubbel verschijnen = het aantal taken dat eronder zitten. Personen die geen projecten hebben en dus ook geen taken komen maar 1 keer voor.
Gewijzigd op 13/01/2015 20:51:15 door Brecht S
Ik heb vriendenvanjomanda.hz zojuist toegevoegd aan mijn favorieten. #ROFLMAOWPIMP
Voor zover ik het kan beoordelen moet je gewoon twee queries uitvoeren, één voor de historie en één voor de taken.