[Mysql] Query results mergen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Kan onderstaand niet veel eenvoudiger? Ik heb 2 queries, query 1 haalt de omzetbedragen uit de database voor een specifieke user, query 2 haalt de totale omzetwaarden uit de database.

Deze resultaten wil ik mergen, aangezien ik beide in 1 grafiek laat zien (totale omzet + omzet van een specifieke user)..

Op dit moment doe ik een foreach over de resultaten van query 1 om daar de resultaten van query 2 aan toe te voegen.

Een UNION gaat hem niet worden, want ik wil de resultaten per maand gescheiden houden.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        $sql = sprintf("
            SELECT MONTHNAME(od.created_at) AS 'name', SUM(od.amount) AS 'user_turnover' FROM offer_document od
            INNER JOIN offer o ON o.id = od.offer_id
            INNER JOIN user u ON u.id = o.sold_by
            WHERE o.sold_by = 94
            GROUP BY MONTH(od.created_at);
            ");

        $sql2 = sprintf("
            SELECT MONTHNAME(od.created_at) AS 'name', SUM(od.amount) AS 'total_turnover' FROM offer_document od
            INNER JOIN offer o ON o.id = od.offer_id
            INNER JOIN user u ON u.id = o.sold_by
            GROUP BY MONTH(od.created_at);
            ");


De data die ik gebruikt voor mijn chart ziet er uiteindelijk zo uit, het liefst heb ik dat dus gewoon geregeld in 1 query..
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
Array
(
    [0] => Array
        (
            [name] => February
            [user_turnover] => 34450.00000
            [total_turnover] => 500000
        )

    [1] => Array
        (
            [name] => June
            [user_turnover] => 1136.00000
            [total_turnover] => 500000
        )

    [2] => Array
        (
            [name] => July
            [user_turnover] => 1338.38000
            [total_turnover] => 500000
        )

    [3] => Array
        (
            [name] => August
            [user_turnover] => 168.70000
            [total_turnover] => 500000
        )

)



Dit is een eenvoudig voorbeeld, want ik pas dit op verschillende plaatsen toe en soms wel met 4 of 5 queries (om bijvoorbeeld de omzet van 5 users in 1 grafiek tegelijk te tonen)..

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 22-09 15:41

voodooless

Sound is no voodoo!

je zou van je selects joins kunnen maken in een derde select die alles weer samen brengt, of subselects gebruiken voor de id's die je nodig hebt:

SQL:
1
SELECT MONTHNAME(od.created_at) AS 'name', SUM(od.amount) AS 'user_turnover' FROM offer_document as od where id in (<select 1>) or id in (<select 2>) GROUP BY MONTH(od.created_at);;


Zoiets?

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 22-09 15:15

DexterDee

I doubt, therefore I might be

Als je toch één keer door de hele tabel loopt met je total query, dan kun je evengoed selectief de turnover van individuele users optellen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
    MONTHNAME(od.created_at) AS 'name', 
    SUM(IF(o.sold_by=94,od.amount,0)) AS 'user94_turnover',
    SUM(IF(o.sold_by=95,od.amount,0)) AS 'user95_turnover',
    SUM(IF(o.sold_by=96,od.amount,0)) AS 'user96_turnover',
    SUM(od.amount) AS 'total_turnover'        
FROM
    offer_document od
INNER JOIN
    offer o ON o.id = od.offer_id
INNER JOIN
    user u ON u.id = o.sold_by
GROUP BY
    MONTH(od.created_at);

Ik heb de query niet getest dus ik weet niet of 'ie het doet, maar het principe zou moeten werken :)

En nog een ander puntje van aandacht, pas op met INNER joins bij berekeningen van totalen. Zoals de query nu is opgebouwd, neemt hij geen records mee van user id's die niet gevonden worden in de 'user' tabel. Mocht er ooit dus (per ongeluk / met opzet) een user uit de 'user' tabel verdwijnen, dan kloppen de historische getallen voor die maand ook niet meer.

[ Voor 20% gewijzigd door DexterDee op 09-09-2011 19:44 . Reden: inner join en totalen ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
awesome _/-\o_ weer wat geleerd, thanks!

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Vraagje: waarom specifiek innerlijk joins en niet in de where clause zelf?

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Omdat expliciet joinen veel duidelijker is.

{signature}

Pagina: 1