Ik ben bezig om een pagina te maken waar alle bestellingen van de webshop in kaart worden gebracht. Ik heb nu de volgende data uit de database:

2012 - 38
Afvalsoort: Houtafval
Container: Afvalcontainer 6m3
Aantal orders: 1
Totaal: € 194.00

2012 - 38
Afvalsoort: Restafval
Container: Afvalcontainer 4m3
Aantal orders: 1
Totaal: € 145.00

2012 - 37
Afvalsoort: Puinafval
Container: Afvalcontainer 10m3
Aantal orders: 1
Totaal: € 139.00

2012 - 37
Afvalsoort: Restafval
Container: Afvalcontainer 4m3
Aantal orders: 1
Totaal: € 155.00

Maar nu is mijn vraag om per week alles bij elkaar te doen. Hieronder staat wat ik uiteindelijk wil hebben.

Week 38 Afvalsoort Container
Bouw- en sloopafval Afvalcontainer 4m3
Houtafval Afvalcontainer 6m3
Restafval Afvalcontainer 4m3
Totaal orders: 3
Totaal bedrag: € 484

Week 37 Afvalsoort Container
Puinafval Afvalcontainer 2,5m3
Groenafval Afvalcontainer 10m3
Totaal orders: 2
Totaal bedrag: € 729

En dit is mijn code:


$res2 = mysql_query("SELECT `content`, YEARWEEK(`updated_at`,1) AS week, YEAR(`updated_at`) AS jaar, COUNT(`id`) as id, SUM(`price_total`) AS totaal
FROM `cart`
WHERE order_status = 'completed (not payed)' or order_status = 'completed (not payed)'
GROUP BY `id`
ORDER BY week DESC, jaar DESC");
while ($arr2 = mysql_fetch_assoc($res2)){

$string2 = $arr2['content'];
$array2 = unserialize($string2);

echo $arr2["jaar"]." - ".substr($arr2["week"], -2)."<br />";

echo "Afvalsoort: ";
if ($array2[0]['choice_waste'] == 3) { echo 'Groenafval'; }
if ($array2[0]['choice_waste'] == 4) { echo 'Houtafval'; }
if ($array2[0]['choice_waste'] == 5) { echo 'Bouw- en sloopafval'; }
if ($array2[0]['choice_waste'] == 6) { echo 'Dakafval'; }
if ($array2[0]['choice_waste'] == 7) { echo 'Grond en zand'; }
if ($array2[0]['choice_waste'] == 8 OR $array2[3]['choice_waste'] == 8) { echo 'Puinafval'; }
if ($array2[0]['choice_waste'] == 9) { echo 'Restafval'; }
if ($array2[0]['choice_waste'] == 10) { echo 'All-in'; }
echo "<br />";

echo "Container: ";
if ($array2[0]['choice_container'] == 10 OR $array2[3]['choice_container'] == 10) { echo 'Big-bag'; }
if ($array2[0]['choice_container'] == 11) { echo 'Afvalcontainer 2,5m3'; }
if ($array2[0]['choice_container'] == 12) { echo 'Afvalcontainer 6m3'; }
if ($array2[0]['choice_container'] == 13) { echo 'Afvalcontainer 7m3'; }
if ($array2[0]['choice_container'] == 14) { echo 'Afvalcontainer 10m3'; }
if ($array2[0]['choice_container'] == 15) { echo 'Afvalcontainer 10m3'; }
if ($array2[0]['choice_container'] == 16) { echo 'Afvalcontainer 24m3'; }
if ($array2[0]['choice_container'] == 17) { echo 'Afvalcontainer 40m3'; }
if ($array2[0]['choice_container'] == 18) { echo 'Afvalcontainer 4m3'; }
if ($array2[0]['choice_container'] == 19) { echo 'Afvalcontainer 11m3'; }
if ($array2[0]['choice_container'] == 20) { echo 'Afvalcontainer 4,5m3'; }
echo "<br />";

echo "Aantal orders: ". $arr2["id"]."<br />";
echo "Totaal: € ".$arr2["totaal"]."<br /><br />";

}

Hopelijk kan iemand me helpen..
Nagenoeg jou hele script in SQL:

SELECT
	t1.yearno,
	t1.weekno,
	t1.amount,
	t1.total,
	t2.content,
	CASE t2.choice_waste
		WHEN 3 THEN 'Groenafval'
		WHEN 4 THEN 'Houtafval'
		WHEN 5 THEN 'Bouw- en sloopafval'
		ELSE 'Garbage' END
	AS choice_waste,
	CASE t2.choice_container
		WHEN 11 THEN 'Afvalcontainer 2,5m3'
		WHEN 12 THEN 'Afvalcontainer 6m3'
		WHEN 13 THEN 'Afvalcontainer 2,5m3'
		ELSE '0m3' END
	AS choice_container
FROM
	(SELECT
		YEAR(update_at) AS yearno,
		DATE_FORMAT(update_at, '%v') AS weekno,
		COUNT(*) AS amount,
		SUM(price_total) AS total
	FROM
		cart
	WHERE
		status LIKE 'completed%'
	GROUP BY
		yearno, weekno
	) AS t1
INNER JOIN
	cart AS t2
	ON
		YEAR(t2.update_at) = t1.yearnr
	AND	
		DATE_FORMAT(t2.update_at, %v) = t1.weeknr
WHERE
	t2.status LIKE 'completed%'
ORDER BY
	t1.yearno DESC, t1.weekno DESC

Het groeperen in de presentatie doe je dan in PHP
Bedankt voor je reactie!! Ik ga er mee aan de slag!
Zo Ger, da's nog eens een query!!! :-s
Hahaha...

Waar leer je zoiets? Heb je misschien een goede tutorial / webpagina waar dit soort informatie is terug te vinden?
Aldoende leert men. Het ziet er overigens ingewikkelder uit dan dat het is :-)(30!)
MySQL heeft een uitgebreide manual, en daar valt veel uit te halen als je weet waar je naar zoekt.
Ik heb het toch wat anders gedaan en stuit op een ander probleem. Hij moet de bedragen van de orders per week optellen. Maar nu telt hij de orders per week + de eerste van de week erna bij elkaar op. En dat doet ie iedere keer..

Waar zit de fout??


$res2 = mysql_query("
SELECT `content`, YEARWEEK(`created_at`,1) AS week, YEAR(`created_at`) AS jaar, COUNT(`id`) as id, `price_total` AS totaal
FROM `cart`
WHERE order_status = 'completed (not payed)' or order_status = 'completed (not payed)'
GROUP BY `id`
ORDER BY week DESC, jaar DESC"
);

$total_records = mysql_num_rows($res2);
$current_record = 1;

$prev_week = '';
$total_orders = 0;
$total = 0;
echo '<table width="50%" border="1">';
while ($arr2 = mysql_fetch_assoc($res2)){
$string2 = $arr2['content'];
$array2 = unserialize($string2);
$week = substr($arr2["week"], -2);

// Switch doet in principe hetzelfde als if
switch ($array2[0]['choice_waste']) {
case 3: $type = 'Groenafval'; break;
case 4: $type = 'Houtafval'; break;
case 5: $type = 'Bouw- en sloopafval'; break;
case 6: $type = 'Dakafval'; break;
case 7: $type = 'Grond en zand'; break;
case 8: $type = 'Puinafval'; break;
case 9: $type = 'Restafval'; break;
case 10: $type = 'All-in'; break;
}

if ($array2[3]['choice_waste'] == 8) { $type = 'Puinafval'; }

switch ($array2[0]['choice_container']) {
case 11: $container = 'Afvalcontainer 2,5m3'; break;
case 12: $container = 'Afvalcontainer 6m3'; break;
case 13: $container = 'Afvalcontainer 7m3'; break;
case 14: $container = 'Afvalcontainer 10m3'; break;
case 15: $container = 'Afvalcontainer 10m3'; break;
case 16: $container = 'Afvalcontainer 24m3'; break;
case 17: $container = 'Afvalcontainer 40m3'; break;
case 18: $container = 'Afvalcontainer 4m3'; break;
case 19: $container = 'Afvalcontainer 11m3'; break;
case 20: $container = 'Afvalcontainer 4,5m3'; break;
}

if ($array2[3]['choice_container'] == 10) { $container = 'Big-bag'; }

if (!empty($type) && !empty($container)) {
// Totaal aantal orders ophogen
$total_orders++;
// Totaalprijs ophogen met totaal van dit record
$total = $total + $arr2["totaal"];
// Als de week van dit record niet hetzelfde is als het vorige record, dan een nieuwe kop aanmaken
if ($prev_week != $week) {
// Alleen uitvoeren als $prev_week geen waarde heeft (totalen neerzetten)
if ($prev_week != '') {
echo '
<tr>
<td class="grijs"><strong>Totaal orders:</strong></td>
<td class="grijs"><strong>'.$total_orders.'</strong></td>
<td class="grijs"><strong>Totaal bedrag:</strong></td>
<td class="grijs"><strong>&euro; '.$total.'</strong></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
';
// Totalen resetten voor volgende week
$total_orders = 0;
$total = 0;
}
// Plaats nieuwe kop
echo '
<tr>
<td bgcolor="#f3f3f3">'.$arr2["jaar"].' - '.$week.'</td>
<td bgcolor="#f3f3f3"><strong>Afvalsoort</strong></td>
<td bgcolor="#f3f3f3"><strong>Container</strong></td>
<td bgcolor="#f3f3f3"><strong>Prijs</strong></td>
</tr>
';
$prev_week = $week;
}

// Plaats type en container
echo '
<tr>
<td></td>
<td>'.$type.'</td>
<td>'.$container.'</td>
<td>&euro; '.$arr2["totaal"].'</td>
</tr>
';

// Indien laatste record, toon totaal
if ($current_record == $total_records) {
$total_orders++;
echo '
<tr>
<td class="grijs"><strong>Totaal orders:</strong></td>
<td class="grijs"><strong>'.$total_orders.'</strong></td>
<td class="grijs"><strong>Totaal bedrag:</strong></td>
<td class="grijs"><strong>&euro; '.$total.'</strong></td>
</tr>
';
}
}

$current_record++;
}
echo '</table>';
Je hebt de verkeerde kolom in de GROUP BY staan.
En ook hier wordt de database verkeerd gebruikt, een reeks gegevens staat niet in 1 kolom maar in afzonderlijke rijen.
Daar had ik de eerdere query eigenlijk op gebaseerd.
Oké. Ja bij GROUP BY moet 'week' komen te staan. Maar wat doe ik nog meer verkeerd dan??
Je slaat nu de complete bestelling in 1 kolom op, hiervoor zou je dus een aparte tabel moeten hebben.
En waar heb je nu de product info staan, toch niet in PHP hoop ik?
Ja dat is het leuke aan deze webshop. Hij is gemaakt met Symfony en daar begrijp ik niet veel van. Maar hij zet alle bestellingen in de kolom "content". Daar staat dan het volgende:

a:1:{i:0;a:4:{s:12:"choice_waste";i:9;s:16:"choice_container";i:18;s:10:"start_date";s:10:"01-10-2012";s:8:"end_date";s:10:"02-10-2012";}}

En als je die uitleest met UNSERIALIZE dan krijg je dus. Type afval en type container.

[size=xsmall]Toevoeging op 19/09/2012 14:12:40:[/size]

2012 - 38 Afvalsoort Container Prijs
Houtafval Afvalcontainer 6m3 € 194.00
Restafval Afvalcontainer 4m3 € 145.00
Totaal orders: 3 Totaal bedrag: € 478

Zo moet het komen te staan. Maar hier zie je al dat hij 3 afvalsoorten heeft, terwijl er maar 2 zijn!! En dat zie je ook in het totaalbedrag..
Welke webshop is dat dan? Dan zullen we die is een zeer slechte beoordeling gaan geven!

Reageren