Hallo allemaal,
Ik zit met een probleem.
Voor mijn nieuwe spel ben ik een ranglijst aan het bouwen.
Ik wil graag dat het rendement (efficiency) van hoog naar laag geordend wordt.
PHP Code:
function getStockTotal($u) {
$query = mysql_query("
SELECT
SUM(amount * rate)
FROM
portfolio
JOIN
rates
ON
portfolio.fund=rates.fund
WHERE
user='$u
'") or die(mysql_error());
$row = mysql_fetch_row($query);
return $row[0];
}
Alvast bedankt!PHP Code:
$query = $mysql->query("SELECT user, money FROM members");
while( $result = mysql_fetch_array($query) ) {
$stock = $rates->getStockTotal($result['user']);
$networth = $stock + $result['money'];
$efficiency = ($networth / 250000) * 100;
$ranglist .= '
<tr>
<td>'.$result['user'].'</td>
<td align="right"><span class="left">€</span>'.number_format($result['money'], 2, ',', '.').'</td>
<td align="right"><span class="left">€</span>'.number_format($stock, 2, ',', '.').'</td>
<td align="right"><span class="left">€</span>'.number_format($networth, 2, ',', '.').'</td>
<td>'.number_format($efficiency, 2, ',', '.').'%</td>
</tr>';
}
echo '
<h1>Ranglijst</h1>
<p>Vergelijk je jezelf met je vrienden en de andere spelers.</p>
<form>
<table>
<tr>
<th>Gebruikersnaam</th>
<th>In kas</th>
<th>In aandelen</th>
<th>Nettowaarde</th>
<th>Rendement</th>
</tr>
'.$ranglist.'
</table>
</form>';
René
- Lastig MySQL vraagstuk.
-
28-04-2009, 21:39 #1
- Berichten
- 571
- Lid sinds
- 17 Jaar
Lastig MySQL vraagstuk.
Laatst aangepast door René Vennik : 28-04-2009 om 21:51
-
-
28-04-2009, 21:54 #2
- Berichten
- 98
- Lid sinds
- 17 Jaar
Ik denk dat je dit het makkelijkste kunt oplossen door de gegevens uit de MySQL tabel te halen, vervolgens de efficiency uit te rekenen, die in een array te zetten, die te sorteren en vervolgens met foreach (of variant) de hele reeks op de pagina dumpen.
-
28-04-2009, 22:03 #3
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
en Order by SUM(amount * rate) ?
-
28-04-2009, 22:04 #4
- Berichten
- 209
- Lid sinds
- 18 Jaar
Ik denk je vraag niet helemala te begrijpen maar is dit wat je bedoeld?
Code:SELECT (amount * rate) AS efficiency FROM rates ORDER BY efficiency DESC
-
28-04-2009, 22:05 #5
- Berichten
- 571
- Lid sinds
- 17 Jaar
@Wilbert
Dat heeft geen zin het moet daarvoor al bepaald zijn.
@Martijn
Dat lukt niet, want je hebt meerdere array's, ik kreeg het in ieder geval niet voor mekaar.
Aanvullend bericht:
@Ivo
Dat is niet wat ik bedoel, het zit wat complexer in elkaar. Het zit namelijk in 3 verschillende tabellen.Laatst aangepast door René Vennik : 28-04-2009 om 22:06 Reden: Automatisch samengevoegd.
-
28-04-2009, 22:06 #6
- Berichten
- 209
- Lid sinds
- 18 Jaar
Dat snap ik, maar is dat niet waar je op uit wil komen? Die ordening?
-
28-04-2009, 22:11 #7
- Berichten
- 571
- Lid sinds
- 17 Jaar
De ordening van wie het meeste heeft qua nettowaarde == efficiency.
Daarvoor heb je de 'money' van de gebruiker + 'totaal waarde aandelen' nodig.
En dat moet dan van hoog naar laag gerangschikt worden.
De getStockTotal return de totale waarde van de aandelen.
Aanvullend bericht:
Eigenlijk zou je:
function getStockTotal($u) {
$query = mysql_query("
SELECT
SUM(amount * rate)
FROM
portfolio
JOIN
rates
ON
portfolio.fund=rates.fund
WHERE
user='$u
'") or die(mysql_error());
$row = mysql_fetch_row($query);
return $row[0];
}
Moeten onderbrengen in:
$query = $mysql->query("SELECT user, money FROM members");
Maar hoe? Ik heb geen idee.Laatst aangepast door René Vennik : 28-04-2009 om 22:15 Reden: Automatisch samengevoegd.
-
28-04-2009, 22:27 #8
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
Naar mijn idee móet je toch eerst de waardes berekenen voordat je erop kunt sorteren?
En het lijkt mij dat dat het snelst gaat bij een order by sum()
Ik kan me niets bedenken dat het kan sorteren zónder dat sql de uiteindelijke waardes weet.
-
28-04-2009, 22:30 #9
- Berichten
- 571
- Lid sinds
- 17 Jaar
Dat klopt, maar je moet ook nog eens de sum() van een meerdere rijen uit 1 tabel berkenen.
Nogmaals een duidelijke uitleg :)
Totaal moet geordend worden.
Totaal = Money + Totale waard aandelen
Money staat in tabel 1.
Totale waard aandelen vinden we door de verschillende fondsen met aantallen uit tabel 2 te halen en naast de huidige koers in tabel 3 te leggen.
Aanvullend bericht:
Online voorbeeld:
be*leg*sp*el*.nl
W: test
G: test
Aanvullend bericht:
Opties -> RanglijstLaatst aangepast door René Vennik : 28-04-2009 om 22:35 Reden: Automatisch samengevoegd.
-
28-04-2009, 23:14 #10
- Berichten
- 6
- Lid sinds
- 16 Jaar
Ik heb het niet getest, maar iets in deze trant (waarschijnlijk moet je hem wel even tweaken naar jou wens (tevens denk ik dat je dit bedoelt, weet het niet zeker). Ik heb 'where user=' weggehaalt.
$query = mysql_query("
SELECT SUM((po.amount * ra.rate) + mem.money) as nettowaarde,
SUM((nettowaarde/250000) * 100) as rendement,
FROM
portfolio po
JOIN rates ra
ON po.fund=ra.fund
JOIN members mem
ON po.user=mem.user
ORDER BY nettowaarde DESC, rendement DESC
'") or die(mysql_error());
$row = mysql_fetch_row($query);
return $row[0];
}
-
29-04-2009, 08:29 #11
- Berichten
- 571
- Lid sinds
- 17 Jaar
Jammer, het is niet gelukt, hij geeft maar 1 rij terug.
-
29-04-2009, 08:34 #12
Stichting WebwinkelKeur
- Berichten
- 864
- Lid sinds
- 19 Jaar
Kun je ook een overzicht van tabellen geven, maakt het overzicht behouden iets makkelijker...
-
29-04-2009, 08:40 #13
- Berichten
- 571
- Lid sinds
- 17 Jaar
id int(10) Nee user varchar(255) Nee pass varchar(255) Nee mail varchar(255) Nee activation tinyint(1) Nee 0 code char(12) Nee money decimal(12,2) Nee 250000.00
Aanvullend bericht:
id int(10) Nee user varchar(255) Nee fund varchar(255) Nee amount int(10) Nee prize decimal(7,3) Nee
Aanvullend bericht:
id tinyint(3) Nee fund varchar(255) Nee rate decimal(7,3) Nee rchange decimal(5,2) Nee
Aanvullend bericht:
In de volgorde: members, portfolio, rates.
Aanvullend bericht:
Hallo allemaal,
Bedankt voor de hulp, en in het speciaal Martijn.
Heb het ongeveer op jouw manier gedaan.
PHP Code:$i = 0;
$query = $mysql->query("SELECT user, money FROM members");
while( $result = mysql_fetch_array($query) ) {
$user[$i] = $result['user'];
$money[$i] = $result['money'];
$stock[$i] = $rates->getStockTotal($result['user']);
$networth[$i] = $stock[$i] + $result['money'];
$i++;
}
arsort($networth);
$i = 0;
foreach( $networth as $key => $value ) {
$user2[$i] = $user[$key];
$networth2[$i] = $value;
$stock2[$i] = $stock[$key];
$money2[$i] = $money[$key];
$i++;
}
Laatst aangepast door René Vennik : 29-04-2009 om 09:47 Reden: Automatisch samengevoegd.
-
03-05-2009, 13:36 #14
- Berichten
- 146
- Lid sinds
- 17 Jaar
SELECT SUM((po.amount * ra.rate) + mem.money) as nettowaarde,
SUM((nettowaarde/250000) * 100) as rendement,
FROM portfolio AS po
LEFT JOIN rates AS ra ON po.fund=ra.fund
LEFT JOIN members mem ON po.user=mem.user
ORDER BY nettowaarde DESC, rendement DESC
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic