[SQL]Krijg niet de juiste waarde uit mijn join

Pagina: 1
Acties:

  • Quibus
  • Registratie: November 2000
  • Laatst online: 09-02 12:23
Ik ben bezig een portefuille beheer script te schrijven om de koersen van mijn aandelen bij te houden. Mijn php script haalt met een cronjob iedere zoveel tijd via finance.yahoo.com de laatste koersen binnen. Aangezien ik ook het koersverloop van verschillende aandelen wil zien heb ik ervoor gekozen om 2 tabellen te maken. In de tabel "stocks" zet ik de globale info van het aandeel, zoals de naam,
het symbool, de aankoopprijs etc. In de tabel "stock_quotes" komen de huidige koersen die ik van yahoo.com haal. De structuur van de tabellen is hieronder te vinden.

stocks
code:
1
2
3
4
5
6
+------+-----------+--------+---------+--------+--------+---------+------------+--------+---------+
| s_id | name      | symbol | type    | manual | number | b_price |     b_date | s_date | s_price |
+------+-----------+--------+---------+--------+--------+---------+------------+--------+---------+
|    4 | Hagemeyer | HGM.AS | aandeel |      0 |    500 |    3.07 | 1138908226 |      0 |       0 |
+------+-----------+--------+---------+--------+--------+---------+------------+--------+---------+
1 row in set (0.00 sec)


stock_quotes
code:
1
2
3
4
5
6
7
+----+------+-------+----------+------+------+------+------------+
| id | s_id | trade | volume   | high | low  | open | date       |
+----+------+-------+----------+------+------+------+------------+
|  2 | 4    |  4.15 | 10394468 | 4.18 | 4.12 | 4.12 | 1144420320 |
|  6 | 4    |   4.3 |        0 |    0 |    0 |    0 | 1144430320 |
+----+------+-------+----------+------+------+------+------------+
2 rows in set (0.00 sec)


Het meeste van de functionaliteit werkt prima, de koersen worden goed van yahoo.com gehaald en ik kan aandelen kopen en verkopen. Ik loop echter tegen een probleem aan bij mijn aandelen overzicht. Ik wil een overzicht weergeven van de aandelen die ik heb. In dit overzicht komt de naam, aankoop datum, en het rendement (huidige koers - aankoop koers). Nu wilde ik een join gebruiken om dit voor elkaar te krijgen. De tabel "stocks" moet gejoined worden met de laatste koers uit de stock_quotes tabel. Dat is dus de rij met de grootste timestamp. Ik heb het geprobeerd met de volgende query.

code:
1
2
3
4
5
6
SELECT stocks.s_id, stocks.name, stocks.number, stocks.b_date, stocks.b_price, 
stock_quotes.trade, MAX( stock_quotes.date ) AS date
FROM stocks
LEFT JOIN stock_quotes ON stocks.s_id = stock_quotes.s_id
WHERE stocks.s_date =0
GROUP BY stocks.s_id


Het resultaat:

code:
1
2
3
4
5
6
+------+-----------+--------+------------+---------+-------+------------+
| s_id | name      | number | b_date     | b_price | trade | date       |
+------+-----------+--------+------------+---------+-------+------------+
|    4 | Hagemeyer |    500 | 1138908226 |    3.07 |  4.15 | 1144430320 |
+------+-----------+--------+------------+---------+-------+------------+
1 row in set (0.00 sec)


De de grootste datum wordt inderdaad uit de tabel gehaald, maar voor de koers neemt MySQL gewoon de waarde van de eerste rij. Hoe is het mogelijk om op de grootste datum te selecteren, zodat ook de bijbehorende koers uit de tabellen gehaald worden?

Alvast bedankt voor de moeite.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:54
Je gebruikt GROUP BY verkeerd. klik

Je moet groeperen op alle columns in je select list die geen aggregate functie zijn.

Wat je dus zult moeten doen, is eerst de max. datum ophalen, en dan die datum gebruiken in je query:
code:
1
2
3
4
5
6
select stocks.s_id, stocks.name, stocks.Number, ....
from stocks
inner join stock_quotes on stocks.s_id = stock_quotes.s_id
where stock_quotes.date = ( select max(help.date) from stock_quotes as help
                                          where help.s_id = stocks.s_id )
and stocks.s_id = ...


(Met een correlated subquery dus)

(Waarom gebruik je trouwens een left join ? Een aandeel zal toch altijd wel een koers hebben ?)

https://fgheysels.github.io/


  • Quibus
  • Registratie: November 2000
  • Laatst online: 09-02 12:23
Dit werkt inderdaad perfect. Ik heb me nooit verdiept in subqueries. Ik wist niet dat ze zo makkelijk te gebruiken zijn. Bedankt voor de hulp. Ik ga die FAQ van GoT even lezen om iets meer te weten te komen over alle SQL syntaxen.