4 tabellen combineren en resultaat weergeven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Brecht S

Brecht S

12/12/2015 11:25:16
Quote Anchor link
Ik ben al een tijdje aan het zoeken naar de juiste query maar geraak er niet aan uit. Hieronder een greep uit mijn 4 mysql tabellen die ik wil combineren:

Tabel academy_landingviews
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
id  user_id  academy_id


Tabel academy_download
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
id  user_id  academy_id


Tabel academy
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
id  titel


Tabel contacten
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
id  status


Nu is het zo dat ik een overzicht wil van alle ebooks die geplaatst zijn onder de tabel academy in combinatie met de status bij de contacten. De status kan bvb koud, lead, prospect of klant zijn.
Wat ik tot nu toe heb zitten proberen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    a.titel, alv.academy_id, SUM(alv.view) as alvv, COUNT(ad.id) as adid
FROM
    academy_landingviews alv
INNER JOIN
    academy_download ad
ON
    alv.academy_id = ad.academy_id
INNER JOIN
    academy a
ON
    alv.academy_id = a.id
INNER JOIN
    contacten c
ON
    alv.user_id = c.id
GROUP BY
        alv.academy_id


Ik krijg nu een overzicht van alle resultaten grouped by de titel van een ebook. Maar nog niet in combinatie met de contacten status. Verder dan dit geraak ik niet. Iemand een suggestie?
Misschien is mijn query ook deels verkeerd. Geen idee...
Nu maak ik een overzicht in een html tabel (zie hieronder) met de resultaten (tabel zit in een loop). Later wil ik dit in grafieken steken.

HTML tabel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<p>Cijfers downloads/landingviews ebooks/wp met ID = <? echo $row['academy_id']; ?> en titel = <?php echo $row['titel']; ?></p>
<table width="50%">
  <tr>
    <td>Anonieme views</td>
    <td><?php echo $row['alvv']; ?></td>
  </tr>
  <tr>
    <td>Anonieme downloads</td>
    <td><?php echo $row['adid']; ?></td>
  </tr>
  <tr>
    <td>Totale conversie</td>
    <td><?php echo round((($row['adid'] / $row['alvv']) * 100), 0); ?>%</td>
  </tr>
</table>
Gewijzigd op 12/12/2015 14:01:17 door Brecht S
 
PHP hulp

PHP hulp

27/04/2024 21:30:54
 
Jan de Laet

Jan de Laet

12/12/2015 13:30:17
Quote Anchor link
GROUP BY alv_academy_id, a.titel, c.status?
Dan groepeer je ook op status. Maar ik weet niet zeker of dit het resultaat is wat je wilt.

Note: in principe moet je bij GROUP BY alle velden noemen die geen aggregate functie zijn (zoals SUM of COUNT). Daarom heb ik a.titel ook toegevoegd.
 
Brecht S

Brecht S

12/12/2015 13:53:31
Quote Anchor link
@Jan: bedankt voor je antwoord. De query die ik liet zien is dus niet juist. Ik krijg niet wat ik wil zien.

Het uiteindelijke resultaat zou moeten zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
Titel
  - Aantal landingviews met status koud: x
  - Aantal downloads met status koud: x
  - Conversie koud: x%
  - Aantal landingviews zonder status (dit zijn de personen die nog niet voorkomen in de tabel contacten): x
  - Aantal downloads zonder status (...): x
  - Conversie anoniem: x%
  - Aantal landingviews met status lead: x
  - Aantal downloads met status lead: x
  - Conversie lead: x%
  - ... (enz voor alle statussen bij de contacten tabel)


En deze tabel dan in een loop per titel. Zie ook mijn voorbeeld html tabel bovenaan. Dit is de uiteindelijke vorm die ik wil.
Gewijzigd op 12/12/2015 13:59:46 door Brecht S
 
Jan de Laet

Jan de Laet

12/12/2015 14:01:56
Quote Anchor link
Zoek maar eens op Google onder "pivot table mysql".
Het komt erop neer dat je de count zo vaak laat terugkomen als er status waardes zijn.

Afhankelijk of je status een vaste lijst met waardes is of kan variëren, kun je de query helemaal uitschrijven of moet je hem in je script genereren.

Als je het Google resultaat niet snapt, kom dan terug dan maak ik een voorbeeld.
 
Brecht S

Brecht S

12/12/2015 14:39:58
Quote Anchor link
@Jan: ik heb het inderdaad opgezocht en vond deze: http://anothermysqldba.blogspot.de/2013/06/pivot-tables-example-in-mysql.html

Nu weet ik wat je bedoeld maar ik geraak niet uit aan mijn query...
Ik zie nog steeds niet wat ik wil zien
 
Jan de Laet

Jan de Laet

12/12/2015 14:47:19
Quote Anchor link
Op basis van deze post: http://stackoverflow.com/questions/7674786/mysql-pivot-table

zou het zoiets worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT
    a.titel, alv.academy_id, SUM(alv.view) as alvv,
    SUM(CASE WHEN (c.status='koud') THEN 1 ELSE 0 END) AS SumKoud,
    SUM(CASE WHEN (c.status='lead') THEN 1 ELSE 0 END) AS SumLead,
    SUM(CASE WHEN (c.status='prospect') THEN 1 ELSE 0 END) AS SumProspect,
    SUM(CASE WHEN (c.status='klant') THEN 1 ELSE 0 END) AS SumKlant
FROM
    academy_landingviews alv
INNER JOIN
    academy_download ad
ON
    alv.academy_id = ad.academy_id
INNER JOIN
    academy a
ON
    alv.academy_id = a.id
INNER JOIN
    contacten c
ON
    alv.user_id = c.id
GROUP BY
        alv.academy_id, a.titel
 
Brecht S

Brecht S

12/12/2015 16:40:16
Quote Anchor link
@Jan: ik heb even je voorbeeld bekeken en beetje aangepast met de aanpassingen die ik ondertussen al heb gedaan in mijn mysql tabellen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
    a.titel, alv.academy_id,
    SUM(CASE WHEN (c.cont_status='koud') THEN 1 ELSE 0 END) AS SumKoud,
    SUM(CASE WHEN (c.cont_status='lead') THEN 1 ELSE 0 END) AS SumLead,
    SUM(CASE WHEN (c.cont_status='prospect') THEN 1 ELSE 0 END) AS SumProspect,
    SUM(CASE WHEN (c.cont_status='klant') THEN 1 ELSE 0 END) AS SumKlant,
    SUM(CASE WHEN (c.cont_status='pool') THEN 1 ELSE 0 END) AS SumPool
FROM
    academy_landingviews alv
INNER JOIN
    academy_download ad
ON
    alv.academy_id = ad.academy_id
INNER JOIN
    academy a
ON
    alv.academy_id = a.id
INNER JOIN
    contacten c
ON
    alv.user_id = c.id
GROUP BY
    alv.academy_id, a.titel


Maar het resultaat is er nog steeds niet. Ik mis ook nog de download aantallen hier in de query. En mijn landingviews cijfers zijn ook niet juist met hetgeen in manueel tel in de db. Als resultaat krijg ik nu ook maar 1 ebook te zien alhoewel er meerdere in mijn db zitten (11 in totaal). Dus denk dat er nog iets met de JOINS zelf ook zal moeten gebeuren?

Hieronder mijn resultaten tabel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<table width="100%">
  <tr>
    <td>Landingviews door koud</td>
    <td><?php echo $row['SumKoud']; ?></td>
    <td>Downloads door koud</td>
    <td><?php echo $row['x']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door lead</td>
    <td><?php echo $row['SumLead']; ?></td>
    <td>Downloads door lead</td>
    <td><?php echo $row['x']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door prospect</td>
    <td><?php echo $row['SumProspect']; ?></td>
    <td>Downloads door prospect</td>
    <td><?php echo $row['x']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door klant</td>
    <td><?php echo $row['SumKlant']; ?></td>
    <td>Downloads door klant</td>
    <td><?php echo $row['x']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door pool</td>
    <td><?php echo $row['SumPool']; ?></td>
    <td>Downloads door pool</td>
    <td><?php echo $row['x']; ?></td>
  </tr>
</table>


Hier ontbreken natuurlijk nog de waarden voor de download aantallen.
Gewijzigd op 12/12/2015 16:42:20 door Brecht S
 
Jan de Laet

Jan de Laet

12/12/2015 17:30:03
Quote Anchor link
Ik hoop dat ik je goed begrijp.
Misschien is het beter om te starten vanuit de academy tabel en die te joinen met subtabellen met de totalen.

Hiermee maak je een totaal query van landings_views per titel en status. Die gebruik ik zo meteen als subquery:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT academy_id, cont_status, count(*)
FROM academy_landingviews
JOIN contacten ON id=user_id
GROUP BY academy_id, status


Datzelfde doen we voor downloads
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT academy_id, cont_status, count(*)
FROM academy_download
JOIN contacten ON id=user_id
GROUP BY academy_id, status


En dat voegen we dan samen met een lijst van titels en alle statussen, startend vanuit de academy tabel. DE CROSS JOIN kun je eventueel vervangen door een tabel met unieke statussen mocht je die hebben.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5

SELECT
    id, titel, status
FROM academy
CROSS JOIN (SELECT DISTINCT cont_status FROM contacten)


En nu alles samen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
SELECT
    id, titel,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool,
    SUM(CASE WHEN (dl.cont_status='koud')     THEN dl.aantal ELSE 0 END) AS SumDlKoud,
    SUM(CASE WHEN (dl.cont_status='lead')     THEN dl.aantal ELSE 0 END) AS SumDlLead,
    SUM(CASE WHEN (dl.cont_status='prospect') THEN dl.aantal ELSE 0 END) AS SumDlProspect,
    SUM(CASE WHEN (dl.cont_status='klant')    THEN dl.aantal ELSE 0 END) AS SumDlKlant,
    SUM(CASE WHEN (dl.cont_status='pool')     THEN dl.aantal ELSE 0 END) AS SumDlPool
FROM academy
CROSS JOIN (SELECT DISTINCT cont_status FROM contacten)

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, count(*) as aantal
     FROM academy_landingviews
     JOIN contacten ON id=user_id
     GROUP BY academy_id, status) AS lv
   ON academy.id=lv.academy_id and contacten.cont_status=lv.cont_status
LEFT OUTER JOIN
   (SELECT academy_id, cont_status, count(*) as aantal
     FROM academy_download
     JOIN contacten ON id=user_id
     GROUP BY academy_id, status) AS dl
   ON academy.id=dl.academy_id and contacten.cont_status=dl.cont_status
GROUP BY id, titel
 
Brecht S

Brecht S

12/12/2015 17:39:21
Quote Anchor link
@Jan: als ik letterlijk jouw voorbeeld even probeer dan krijg ik een foutmelding: Every derived table must have its own alias
Ik heb geen idee wat ze hiermee willen zeggen?

en ik zie bvb ook dl.cont_status en lv.cont_status staan. Maar de cont_status is de lead, koud, ... en die komt enkel maar voor in de tabel contacten.
Gewijzigd op 12/12/2015 17:42:37 door Brecht S
 
Jan de Laet

Jan de Laet

12/12/2015 17:59:21
Quote Anchor link
Ah, ik denk dat er nog een alias ontbreekt (AS) bij een van de subqueries (SELECT DISTINCT...). Ik heb het dan ook uit de losse pols uitgetikt, want ik heb jouw tabellen natuurlijk niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
SELECT
    id, titel,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool,
    SUM(CASE WHEN (dl.cont_status='koud')     THEN dl.aantal ELSE 0 END) AS SumDlKoud,
    SUM(CASE WHEN (dl.cont_status='lead')     THEN dl.aantal ELSE 0 END) AS SumDlLead,
    SUM(CASE WHEN (dl.cont_status='prospect') THEN dl.aantal ELSE 0 END) AS SumDlProspect,
    SUM(CASE WHEN (dl.cont_status='klant')    THEN dl.aantal ELSE 0 END) AS SumDlKlant,
    SUM(CASE WHEN (dl.cont_status='pool')     THEN dl.aantal ELSE 0 END) AS SumDlPool
FROM academy
CROSS JOIN (SELECT DISTINCT cont_status FROM contacten) AS c

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, count(*) as aantal
     FROM academy_landingviews
     JOIN contacten ON id=user_id
     GROUP BY academy_id, status) AS lv
   ON academy.id=lv.academy_id and c.cont_status=lv.cont_status
LEFT OUTER JOIN
   (SELECT academy_id, cont_status, count(*) as aantal
     FROM academy_download
     JOIN contacten ON id=user_id
     GROUP BY academy_id, status) AS dl
   ON academy.id=dl.academy_id and c.cont_status=dl.cont_status
GROUP BY id, titel


de lv_cont_status komt ook uit contacten, ik doe daarvoor de JOIN contacten in de subquery.

Probeer de queries uit mijn vorige post maar eens stap voor stap uit te voeren in bv phpMyAdmin. Dan zie je wat het resultaat telkens is.
 
Brecht S

Brecht S

12/12/2015 18:28:37
Quote Anchor link
@Jan: we komen in de buurt. Ik heb de query lichtjes gewijzigd want er waren nog een paar foutjes. Ik krijg nu een overzicht met aantallen hier en daar. Moet wel nog eens controleren of de aantallen juist zijn overal.
Maar er is nog 1 probleem. Ik heb soms geen user_id in de tabellen en die worden nu niet weergegeven. Enkel de resultaten die ook een user_id hebben worden nu weergegeven.
Het zou kunnen dat iemand een landingview doet maar niet gekend is in de tabel contacten, dan is dit dus een anonieme view. Bij de downloads kan dit niet, want iedereen die een download doet krijgt ook een user_id (als ze er nog geen hadden). Het gaat hier enkel over de landingviews.

Aangepaste query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
SELECT
    id, titel,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool,
    SUM(CASE WHEN (dl.cont_status='koud')     THEN dl.aantal ELSE 0 END) AS SumDlKoud,
    SUM(CASE WHEN (dl.cont_status='lead')     THEN dl.aantal ELSE 0 END) AS SumDlLead,
    SUM(CASE WHEN (dl.cont_status='prospect') THEN dl.aantal ELSE 0 END) AS SumDlProspect,
    SUM(CASE WHEN (dl.cont_status='klant')    THEN dl.aantal ELSE 0 END) AS SumDlKlant,
    SUM(CASE WHEN (dl.cont_status='pool')     THEN dl.aantal ELSE 0 END) AS SumDlPool
FROM academy
CROSS JOIN (SELECT DISTINCT cont_status FROM contacten) AS c

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, count(*) as aantal
     FROM academy_landingviews alv
     JOIN contacten c ON c.id=alv.user_id
     GROUP BY academy_id, cont_status) AS lv
   ON academy.id=lv.academy_id and c.cont_status=lv.cont_status
LEFT OUTER JOIN
   (SELECT academy_id, cont_status, count(*) as aantal
     FROM academy_download adl
     JOIN contacten c ON c.id=adl.user_id
     GROUP BY academy_id, cont_status) AS dl
   ON academy.id=dl.academy_id and c.cont_status=dl.cont_status
GROUP BY id, titel


En de bijhorende HTML tabel (die in een loop zit):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<table width="70%">
  <tr>
    <td>Landingviews door anoniem</td>
    <td><?php echo $row['x']; ?></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>Landingviews door koud</td>
    <td><?php echo $row['SumLvKoud']; ?></td>
    <td>Downloads door koud</td>
    <td><?php echo $row['SumDlKoud']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door lead</td>
    <td><?php echo $row['SumLvLead']; ?></td>
    <td>Downloads door lead</td>
    <td><?php echo $row['SumDlLead']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door prospect</td>
    <td><?php echo $row['SumLvProspect']; ?></td>
    <td>Downloads door prospect</td>
    <td><?php echo $row['SumDlProspect']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door klant</td>
    <td><?php echo $row['SumLvKlant']; ?></td>
    <td>Downloads door klant</td>
    <td><?php echo $row['SumDlKlant']; ?></td>
  </tr>
  <tr>
    <td>Landingviews door pool</td>
    <td><?php echo $row['SumLvPool']; ?></td>
    <td>Downloads door pool</td>
    <td><?php echo $row['SumDlPool']; ?></td>
  </tr>
</table>


Dus hier zit ik nog met de x die nog een cijfer moet krijgen
Gewijzigd op 12/12/2015 18:36:04 door Brecht S
 
Jan de Laet

Jan de Laet

12/12/2015 18:39:26
Quote Anchor link
Oke.
Ik heb een paar vragen:
- geen user in landing_views: Wat is dan de waarde van user_id in deze tabel? Is dat NULL?
Mogelijk los je dit al op door regel 19 JOIN te vervangen door LEFT OUTER JOIN.


- Wat is de status van een anonieme user? Als je voorgaande verandert wordt status voor een anonieme user ook NULL.
En die vergelijken we nog nier op regel 3-7 en hebben we niet in de CROSS JOIN
 
Brecht S

Brecht S

12/12/2015 18:46:10
Quote Anchor link
De waarde van user_id in de tabel landingviews is dan 0 (niet NULL).
Er hangt op dit moment dus ook geen contact aan want het is nog niet gekend. Door een download te doen zet ik een cookie die de user_id gelijk gaat stellen aan de net ge-inserte ID bij de contacten. Zo krijgen we dus de user_id in de downloads. Gaat iemand daarachter naar een andere landingspagina krijgt die terug een landingview en dan heeft die dus wel een user_id.

Een anonieme user heeft dus geen cont_status (om op je 2de vraag te antwoorden).
Zoals je kan zien wil ik in mijn html tabel hier ook een aantal (via een SUM) op 'plakken' (voor de waarde waar nu 'x' staat).
Hoe pak ik dit het best aan?
Gewijzigd op 12/12/2015 18:49:43 door Brecht S
 
Jan de Laet

Jan de Laet

12/12/2015 18:58:21
Quote Anchor link
Een rij aan contacten toevoegen met id=0 en status='anoniem', mocht id een auto-increment zijn dan eerst toevoegen en met phpMyAdmin de id wijzigen naar 0.
De subquery van landings_view geeft dan ook een regel terug voor status anoniem.
Voor regel 3 kun je dan
SUM(CASE WHEN (lv.cont_status='anoniem') THEN lv.aantal ELSE 0 END) AS SumLvAnoniem,
toevoegen.

Dit is het eenvoudigst, wil je dit niet dan is er misschien nog wel een mogelijkheid maar die is iets ingewikkelder.
 
Brecht S

Brecht S

12/12/2015 19:35:04
Quote Anchor link
@Jan: ik heb de html tabel nog wat geoptimaliseerd en de query aangepast. Het schijnt te lukken. Ik moet wel de resultaten nog controleren of alles mooi geteld is. Bedankt tot nu toe.
Ik kom er op terug na controle. Ik ben ook bezig met een bron toe te voegen hoe mensen op een bepaalde landingspagina zijn terechtgekomen. Hiervan zou ik ook een tabel willen maken of de 2 samenvoegen. Daar kom ik later op terug.

Toevoeging op 12/12/2015 19:36:19:

Ken jij al die mogelijkheden in de queries uit je hoofd? Dit is toch een heel ingewikkelde volgens mij. Of heb je daar een bepaald progje voor?
 
Jan de Laet

Jan de Laet

12/12/2015 19:41:00
Quote Anchor link
Mooi dat het lukt en graag gedaan.
Ik ken deze constructies wel uit het hoofd, maar dat is dan wel na heel veel jaren ervaring met allerlei varianten van sql. En deze constructies zijn niet ongebruikelijk.

Ik ben nu ook weg, misschien treffen we elkaar morgen nog.
 
Brecht S

Brecht S

13/12/2015 00:23:15
Quote Anchor link
Ik ben al even aan het zoeken naar hoe ik de bron kan mee opnemen in de query. Het zit zo dat de tabel met landingviews en de tabel met de downloads beiden een bronvermelding kunnen hebben maar dat is niet altijd zo. Buiten de SUM's heb ik ook regel 31 en regel 25 aangepast met het veld bron.

Dus had ik volgende query geprobeerd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
SELECT
    id, titel, type,
    SUM(CASE WHEN (lv.cont_status='anoniem')  THEN lv.aantal ELSE 0 END) AS SumLvAnoniem,
    SUM(CASE WHEN (lv.cont_status='anoniem' AND lv.bron='facebook')  THEN lv.aantal ELSE 0 END) AS SumLvAnoniemFacebook,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud,
    SUM(CASE WHEN (lv.cont_status='koud' AND lv.bron='facebook')  THEN 1 ELSE 0 END) AS SumLvKoudFacebook,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead,
    SUM(CASE WHEN (lv.cont_status='lead' AND lv.bron='facebook')  THEN 1 ELSE 0 END) AS SumLvLeadFacebook,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect,
    SUM(CASE WHEN (lv.cont_status='prospect' AND lv.bron='facebook')  THEN 1 ELSE 0 END) AS SumLvProspectFacebook,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant,
    SUM(CASE WHEN (lv.cont_status='klant' AND lv.bron='facebook')  THEN 1 ELSE 0 END) AS SumLvKlantFacebook,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool,
    SUM(CASE WHEN (lv.cont_status='pool' AND lv.bron='facebook')  THEN 1 ELSE 0 END) AS SumLvPoolFacebook,
    
    SUM(CASE WHEN (dl.cont_status='koud')     THEN dl.aantal ELSE 0 END) AS SumDlKoud,
    SUM(CASE WHEN (dl.cont_status='lead')     THEN dl.aantal ELSE 0 END) AS SumDlLead,
    SUM(CASE WHEN (dl.cont_status='prospect') THEN dl.aantal ELSE 0 END) AS SumDlProspect,
    SUM(CASE WHEN (dl.cont_status='klant')    THEN dl.aantal ELSE 0 END) AS SumDlKlant,
    SUM(CASE WHEN (dl.cont_status='pool')     THEN dl.aantal ELSE 0 END) AS SumDlPool
FROM academy
 JOIN (SELECT DISTINCT cont_status FROM contacten) AS c

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, count(*) as aantal, bron
     FROM academy_landingviews alv
     LEFT OUTER JOIN contacten c ON c.id=alv.user_id
     GROUP BY academy_id, cont_status) AS lv
   ON academy.id=lv.academy_id and c.cont_status=lv.cont_status
LEFT OUTER JOIN
   (SELECT academy_id, cont_status, count(*) as aantal, bron
     FROM academy_download adl
     JOIN contacten c ON c.id=adl.user_id
     GROUP BY academy_id, cont_status) AS dl
   ON academy.id=dl.academy_id and c.cont_status=dl.cont_status
GROUP BY id, titel


Maar dan zijn de waarden bij SumLvAnoniemFacebook bvb dezelfde als die uit de SumLvAnoniem. Waarschijnlijk omdat ik geen count heb van de waarden in de sum met de bron.
Ik heb geprobeerd om een count te maken maar dat wil maar niet lukken.

Maar dit is niet helemaal wat ik eigenlijk wou. De bron kan namelijk alles bevatten en niet alleen facebook. Denk dat het geen goed idee is om die waarden vast te zetten omdat ik nu nog niet weet wat de bronnen allemaal kunnen zijn in de toekomst.
Gewijzigd op 13/12/2015 00:24:39 door Brecht S
 
Jan de Laet

Jan de Laet

14/12/2015 09:32:44
Quote Anchor link
Even vooraf, bij gebruik van GROUP BY is het belangrijk om daar alle velden te noemen die niet in SUM of COUNT zitten. Je hebt hier en daar bron toegevoegd in de SELECT, die moet je dan ook in de GROUP BY zetten.

Maar ik denk dat je bron anders moet oplossen, gezien je laatste opmerking.
Ik denk dat het beter is om de query op te splitsen: eerst een met de totalen op status niveau en dan een aparte (nieuwe) query voor de totalen per bron voor die status.

In je html tabel tabel krijg je dan:
id1 titel1 --totalen landing-views per status-- --totalen download per status
bron 1 --totalen landing-views per status voor deze bron--
bron 2 --totalen landing-views per status voor deze bron--
enz
id2 titel2 --totalen landing-views per status-- --totalen download per status
bron 1 --totalen landing-views per status voor deze bron--
bron 2 --totalen landing-views per status voor deze bron--
enz
enz

Dus uit de 1e query haal je alles wat verwijst naar bron weg en binnen de lus waar je deze 1 voor 1 verwerkt voer je een nieuwe query uit die de getallen per bron voor die titel ophaalt. Hoe dat moet hangt een beetje af hoe je dit nu in php doet.

Die 2e query zou iets kunnen zijn als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
    id, titel, type, bron,
    SUM(CASE WHEN (lv.cont_status='anoniem')  THEN lv.aantal ELSE 0 END) AS SumLvAnoniem,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool,
FROM academy
 JOIN (SELECT DISTINCT cont_status FROM contacten) AS c

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, bron, count(*) as aantal
     FROM academy_landingviews alv
     LEFT OUTER JOIN contacten c ON c.id=alv.user_id
     GROUP BY academy_id, cont_status) AS lv
   ON academy.id=lv.academy_id and c.cont_status=lv.cont_status
WHERE id= -hier de id die je nu verwerkt-
GROUP BY id, titel, bron
 
Brecht S

Brecht S

14/12/2015 13:02:23
Quote Anchor link
Jan, ik zie wat je bedoeld. Ik zal eens proberen.
Op regel 8 mag er geen komma meer staan (er zat een mysql foutje in) achteraan ;-)

Toevoeging op 14/12/2015 14:26:05:

Jan, er zit toch iets raar in.
Hieronder de mysql die ik gebruik:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
    id, titel, type, bron,
    SUM(CASE WHEN (lv.cont_status='anoniem')  THEN lv.aantal ELSE 0 END) AS SumLvAnoniem1,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud1,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead1,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect1,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant1,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool1
FROM academy
 JOIN (SELECT DISTINCT cont_status FROM contacten) AS c

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, bron, count(*) as aantal
     FROM academy_landingviews alv
     LEFT OUTER JOIN contacten c ON c.id=alv.user_id
     GROUP BY academy_id, cont_status) AS lv
   ON academy.id=lv.academy_id and c.cont_status=lv.cont_status
WHERE id= '$academy_id'
GROUP BY id, titel, bron


Als ik nu $row['SumLvAnoniem1'] doe in een html tabel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<table width="40%" >
  <tr>
    <td colspan="2">Landingviews door anoniem via <?php echo $row['bron']; ?></td>
    <td colspan="2"><?php echo $row['SumLvAnoniem1']; ?></td>
  </tr>
  <tr>
    <td colspan="2">Landingviews door koud via <?php echo $row['bron']; ?></td>
    <td colspan="2"><?php echo $row['SumLvKoud1']; ?></td>
  </tr>
</table>


Dan krijg ik telkens 2 resultaten bij de eerste <tr> en ook 2 resultaten bij de 2de <tr> maar dat is niet juist, ook de cijfers zijn niet juist. Van waar komt dat 2de cijfers (dat trouwens ook 0 is iedere keer)?
En de bron krijg ik ook niet te zien als ik $row['bron']; doe.
Gewijzigd op 14/12/2015 14:29:37 door Brecht S
 
Jan de Laet

Jan de Laet

14/12/2015 20:21:05
Quote Anchor link
Brecht, je moet altijd als je GROUP BY gebruikt zorgen dat je velden bij en SELECT en GROUP BY overeen komen.

In de subquery ontbreekt bron in GROUP BY (mijn fout)
In de omsluitende query heb je type in SELECT toegevoegd. Dit moet je weghalen of ook toevoegen bij GROUP BY onderaan.

Als jet goed is, is de uitkomst van de deze query iets als (ik heb type even weggelaten):
id titel bron SumLvAnoniem1 SumLvKoud1 SumLvLead1 SumLvProspect1 SumLvKlant1 SumLvPool1
1 T1 facebook 12 3 2 6 1 8
1 T1 website 8 12 3 5 5 2
enz

Ik zou deze dan ook in 1 <tr> weergeven, maar het kan ook in meerdere.
Probeer de query eens uit in iets als phpMyAdmin en kijk of je het gewenste resultaat krijgt.

Ik zou oppassen met de veldnaam type want dat is een gereserveerd woord in sql, je kunt beter een andere veldnaam kiezen als je dit veld nodig hebt.
 
Brecht S

Brecht S

14/12/2015 20:49:39
Quote Anchor link
Mijn query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
    id, titel, bron,
    SUM(CASE WHEN (lv.cont_status='anoniem')  THEN lv.aantal ELSE 0 END) AS SumLvAnoniem1,
    SUM(CASE WHEN (lv.cont_status='koud')     THEN lv.aantal ELSE 0 END) AS SumLvKoud1,
    SUM(CASE WHEN (lv.cont_status='lead')     THEN lv.aantal ELSE 0 END) AS SumLvLead1,
    SUM(CASE WHEN (lv.cont_status='prospect') THEN lv.aantal ELSE 0 END) AS SumLvProspect1,
    SUM(CASE WHEN (lv.cont_status='klant')    THEN lv.aantal ELSE 0 END) AS SumLvKlant1,
    SUM(CASE WHEN (lv.cont_status='pool')     THEN lv.aantal ELSE 0 END) AS SumLvPool1
FROM academy
 JOIN (SELECT DISTINCT cont_status FROM contacten) AS c

LEFT OUTER JOIN
    (SELECT academy_id, cont_status, bron, count(*) as aantal
     FROM academy_landingviews alv
     LEFT OUTER JOIN contacten c ON c.id=alv.user_id
     GROUP BY academy_id, cont_status, bron) AS lv
   ON academy.id=lv.academy_id and c.cont_status=lv.cont_status
WHERE id= '$academy_id'
GROUP BY id, titel, bron


Ik heb nog steeds dubbele waarden in de <tr>'s waarvan de bron niet is gekend. Uiteraard is er niet altijd een bron meegegeven. Of is dit hier verplicht?


Ik was even een test aan het doen en ik zie toch dat de cijfers precies wel juist zijn alleen is de weergave precies raar. Vb van een resultaat bij 1 ebook met id 11:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
11 - Landingviews door anoniem via    0
11 - Landingviews door koud via    0
11 - Landingviews door anoniem via    1
11 - Landingviews door koud via    0
11 - Landingviews door anoniem via facebook    2
11 - Landingviews door koud via facebook    0
Gewijzigd op 14/12/2015 21:05:55 door Brecht S
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.