[mysql / php] query met select sum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Ik heb een tabel grid met daarin de kolommen:
ID, AREA, PERIMETER, REMARKS, RELIEF, DIFFICULTY, SOURCE, CENTER_X, CENTER_Y, TEST_COSTS

Nu is het de bedoeling dat mysql uitrekent wat de totale TEST_COST is bij een bepaalde selectie van CENTER_X en CENTER_Y.
Deze query werkt goed
PHP:
1
$sql_select = "SELECT sum(TEST_COST) as testkosten FROM grid";

Vervolgens kan ik met de onderstaande code de totale TEST_COST berekenen, maar dat is dus van alle TEST_COST entries
PHP:
1
2
3
$result = mysql_query($sql_select);
$fetchresult = mysql_fetch_array($result); 
$testkosten = $fetchresult["testkosten"];


Als ik dan de query uitbreid met:
PHP:
1
2
3
$sql_select = "SELECT sum(TEST_COST) as testkosten, CENTER_X, CENTER_Y
FROM grid WHERE CENTER_X BETWEEN $inix AND $endx
AND CENTER_Y BETWEEN $endy AND $iniy";

Dan gaat het mis:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/html/test/dbtest2.php on line 35

Weet iemand hoe ik dit probleem op kan lossen? Graag zou ik deze berekening door mysql laten doen omdat dit sneller is. Maar als het niet anders kan zal ik maar moeten zoeken naar een oplossing waarmee ik het door php laat uitrekenen.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20-09 14:03
Je moet alleszins je query nog uitbreiden met een GROUP BY clause

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 19-09 11:05
Wat voor foutmelding geeft MySQL?

Acties:
  • 0 Henk 'm!

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 17-07 14:45
Als je achter je query
PHP:
1
or die(mysql_error());

zet, dan krijg je een wat gedetaileerdere foutmelding...
Maar als je de SUM() van een kolom wilt hebben en daarbij nog meer kolommen wilt selecteren, moet je een GROUP BY clausule opnemen in je statement. Ik denk dat het daarom nu fout gaat ...

edit:

laat :z

[ Voor 5% gewijzigd door RupS op 24-03-2003 13:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

draai je query eens met $inix en $endx ingevuld dus bijv

SELECT sum(TEST_COST) as testkosten, CENTER_X, CENTER_Y FROM grid WHERE CENTER_X BETWEEN 0 AND 100 AND CENTER_Y BETWEEN 10 AND 25

Als die het wel doet dan zit het in de definitie van je variabele

Acties:
  • 0 Henk 'm!

  • creative8500
  • Registratie: September 2001
  • Laatst online: 01-02 14:14

creative8500

freedom.

als aanvulling op holeman: wanneer het dan wél werkt, gebruik dan niet dit:
PHP:
1
2
3
<?
$sql_select = "SELECT sum(TEST_COST) as testkosten, CENTER_X, CENTER_Y FROM grid WHERE CENTER_X BETWEEN $inix AND $endx AND CENTER_Y BETWEEN $endy AND $iniy";
?> 

maar
PHP:
1
2
3
4
5
6
<?
$sql_select = "SELECT sum(TEST_COST) as testkosten, CENTER_X, CENTER_Y FROM grid WHERE CENTER_X BETWEEN ".$inix." AND ".$endx." AND CENTER_Y BETWEEN ".$endy." AND ".$iniy;

$query = mysql_query($sql_select) /* plus deze aanvulling: */ or die(mysql_error());
// zo krijg je de de foutmelding van MySQL in plaats van het bericht van PHP dat er geen valide query is.
?> 

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Het maakt geen verschil of ik $inix, etc gebruik of dat ik daar waarden/cijfers voor invul in de query zelf. Daar zit het probleem kennelijk niet. De foutmelding die mysql gaf had inderdaad met GROUP BY te maken.
Ik selecteer nu ook ID uit de tabel en heb dan de volgende query:
PHP:
1
2
3
$sql_select = "SELECT ID, CENTER_X, CENTER_Y, TEST_COST, sum(TEST_COST) as testkosten 
FROM grid WHERE CENTER_X BETWEEN ".$inix." AND ".$endx." 
AND CENTER_Y BETWEEN ".$endy." AND ".$iniy." GROUP BY ID";

En dan met:
PHP:
1
2
3
4
$result = mysql_query($sql_select) 
    or die(mysql_error()); 
$fetchresult = mysql_fetch_array($result); 
$testkosten = $fetchresult["testkosten"];

wordt het resultaat opgehaald. Alleen wordt het totaal van alle TEST_COSTs niet berekend maar wordt de waarde van de eerst geselecteerde entry weergegeven.

Voor het 'gemak' geef ik de selectie nu ook even visueel weer in een tabel, vandaar dat in de query nu TEST_COST en sum(TEST_COST) staat. Dit maakt voor het resultaat niets uit, heb met en zonder geprobeerd en het resultaat is precies hetzelfde.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$num = mysql_numrows($result);

<wat code voor een tabel>
$i=0;
while ($i < $num) {
$ID = mysql_result($result,$i,"ID");
$CENTER_X = mysql_result($result,$i,"CENTER_X");
$CENTER_Y = mysql_result($result,$i,"CENTER_Y");
$TEST_COST = mysql_result($result,$i,"TEST_COST");
<nog wat code voor een tabel>
++$i;
}

De geselecteerde entries lijken verder allemaal wel te kloppen. Alleen nu het berekenen nog. Ik heb nergens @'s in de php code staan dus foutmeldingen zouden dan als het goed is niet onderdrukt moeten worden voor zover ik weet. Toch wordt er geen foutmelding gegeven en wordt er niets berekent, maar voor sum(TEST_COST) wordt de waarde van de eerste entry genomen.

[ Voor 6% gewijzigd door Blorgg op 24-03-2003 15:42 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20-09 14:03
Je moet niet groeperen op dat ID, maar je moet groeperen op ieder veld dat in je select-clause staat en geen aggregated functie is; je moet dus op alle velden groeperen behalve dat 'sum' veld.
Probeer eens jouw query (dus enkel group by id) te doen in een echt DBMS, en je zal ook een foutmelding krijgen, dus, doe het van de eerste keer goed:
code:
1
2
3
4
SELECT center_x, center_y, SUM(test_cost)
FROM grid
WHERE .....
GROUP BY center_x, center_y


ps: zorg ook eens voor een goede uitlijning van je code, zodat de lay-out niet verneukt wordt

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:13

Dido

heforshe

Doet zoiets dan niet wat je wilt?
code:
1
2
3
4
5
SELECT sum(TEST_COST) as testkosten, CENTER_X, CENTER_Y
  FROM grid 
 GROUP BY CENTER_X, CENTER_Y
HAVING CENTER_X BETWEEN $inix AND $endx
   AND CENTER_Y BETWEEN $endy AND $iniy";

Je kunt geen SUM(iets) selecteren plus andere niet gesommeerde gegevens zonder een GROUP BY.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Verwijderd

je haalt als ik het niet mis heb 3 velden op, sum(TEST_COST) CENTER_X en CENTER_Y

als je nu enkel sum(TEST_COST) neemt, dan gaan die between's nog steeds werken, en gaat je query het volgens mij wel doen....
(je hebt nog steeds de foutmelding niet gegeven vna mysql_error(), daar is al 3 keer naar gevraagd ofzo :))
Pagina: 1