Hallo PHPler.
Bei mir taucht leider ein Problem auf, das ich mir nicht erklären kann und wo ich weder bei deutschen noch englischen Seiten wirklich eine Lösung finde - vielleicht habe ich auch die falschen Stichwörter benutzt bei der Suche nach Antworten.
Ich möchte eine Summe bilden aus zwei Tabellen und als Ergebnis rauskommen sollte eigentlich
2 / 10 / 180 / 145 / -180 / 145 / -35
2 / 11 / 45 /30 /-45 / 30 / -15
Aber statt dessen kommt folgendes:
2 / 10 / 540 / 290 / -540 / 290 / -250
2 / 11 / 45 /30 /-45 / 30 / -15
Wieso? Ich verstehe es nicht.
Ist ein Fehler im Code, den ich nicht verstehe?
PHP-Code:
$query = "SELECT ex_st_sell.stock_id, ex_st_buy.stockprice, COUNT(ex_st_sell.stockcount) AS sellcount, COUNT(ex_st_buy.stockcount) AS buycount ".
"FROM ex_st_sell, ex_st_buy ".
"WHERE ex_st_sell.stock_id = ex_st_buy.stock_id AND ex_st_sell.stockprice = ex_st_buy.stockprice ".
"GROUP BY ex_st_sell.stock_id, ex_st_sell.stockprice ".
"ORDER BY ex_st_sell.stock_id";
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Hallo Ckaos, erst einmal meinen Dank, dass du mich darauf aufmerksam machst, dass ich die Tabellen noch beschreiben könnte. Das mache ich jetzt erstmal.
Die beiden Tabellen habe ich als JPEG-Datei mit ihrem jeweiligen Namen versehen angehangen. Das ist leichter zu überblicken als wenn ich hier eine lose Tabelle reinschreibe.
Nun zum Ziel dessen:
Wie man anhand der Bezeichnungen im Code erkennen konnte, will/möchte ich eine Preisfeststellung schreiben, wie es an der Börse angewandt wird.
Heißt folgendes: Es gibt bei einem Aktienstückpreis von 10 Euro zirka 100 Verkäufer und 120 Käufer mit je einer Aktie, so gibt es einen Umsatz von 100 Aktien. Denn der Bedarf der 120 Käufer kann nur bedingt, durch die 100 Verkäufer bedient werden.
Bei einem Aktienpreis von 11 Euro gibt es 110 Verkäufer und 110 Käufer. Jeder hat je eine Aktie. Angebot und Nachfrage sind gedeckt. 110 Aktien wechseln den Besitzer.
Bei einem Aktienpreis von 12 Euro gibt es 120 Verkäufer und 100 Käufer. Jeder hat nur eine Aktie. Somit wechseln 100 Aktien den Besitzer.
Der neue Preis wäre 11 Euro, da 110 Aktien den Besitzer wechseln.
Man muss betonen, dass der Aktienpreis jener ist, den Verkäufer und Käufer für sich bestimmen. Man sucht und fwindet sich (meistens). Verkäufer A sagt, dass er für 11 Euro seine Aktie verkaufen will, muss aber hoffen, dass jemand diese auch für 11 Euro kaufen will.
Nun zum PHP-Problem.
In den 2 Tabellen sind Verkaufsaufträge (ex_st_sell) und Kaufaufträge (ex_st_buy) gespeichert. Alle 5 Minuten soll dann der Preis herausgefunden werden. Dazu aber sollen die Einträge aus den Tabellen summiert werden und dies anhand dessen, dass Stock_ID und Stockprice in beiden Tabellen gleich sind. Also z.B. wenn ex_st_sell.stock_id (2) = ex_st_buy.stock_id (2) und ex_st_sell.stockprice (10) = ex_st_buy.stockprice (10), so dass anhand Stock-ID mit 2 und Preis mit 10.
Aber in diesem Schritt will ich eben nur erstmal die Anzahl der Aktien (stockcount) nur summieren (bei sell wäre das 90 + 90). Anhand einer transaction-Tabelle, wo ich die Daten später einführen will (echo dient nur der Überprüfung, dass es richtig läuft) will ich dann später per MAX() den höchsten Umsatzwert heraussuchen.
Ich hoffe nur, dass das jetzt nicht zu kompliziert erklärt wurde von mir.
Also momentan sehe ich einen Select, der 4 Werte holt. In deiner WHILE wird dem ein 5. Wert hinzugefügt. Lt. Echo dürften auch nur 5 Werte erscheinen.
In deinem Beispiel werden aber 7 ausgegeben.
Lt. deiner Aussage hast du aber nur COUNT gegen SUM getauscht.
Ich glaub dein Code, hier besonders dein SELECT, stimmt nicht mit dem überein, was du uns hier vorgegeben hast. 2 zusätzliche Werte werden nicht einfach so ausgegeben.
Danke, Urvater, für den Hinweis. Das lag daran, dass ich zuvor einige Male am Code gearbeitet habe und den geändert habe, in der Hoffnung, das Ergebnis zu finden. Aber nun, leider war auch dies falsch. :-(
PHP-Code:
$query = "SELECT ex_st_sell.stock_id, ex_st_buy.stockprice, SUM(ex_st_sell.stockcount) AS sellcount, SUM(ex_st_buy.stockcount) AS buycount, ex_st_sell.total_s, ex_st_buy.total_b ".
"FROM ex_st_sell, ex_st_buy ".
"WHERE ex_st_sell.stock_id = ex_st_buy.stock_id AND ex_st_sell.stockprice = ex_st_buy.stockprice ".
"GROUP BY ex_st_sell.stock_id, ex_st_sell.stockprice ".
"ORDER BY ex_st_sell.stock_id";
Aber in diesem Schritt will ich eben nur erstmal die Anzahl der Aktien (stockcount) nur summieren (bei sell wäre das 90 + 90).
Nun so wie ich das sehe hast du ein denkfehler bei deinem JOIN
Zitat:
FROM ex_st_sell, ex_st_buy "
Da er beide Tabellen in bezug bringt kommt das ergebnis was du nicht willst.
anhand des Bsp.
Zitat:
AND ex_st_sell.stockprice = ex_st_buy.stockprice "
er nimmt ja die "sell" und joined dann "buy"
Bei Wert 10 findet er in "sell" 2 Einträge. Bei "buy" dann 3.
Rechnung: 2 * 3 = 6 also summe= 6*90 = 540 also das Angezeigte.
Durch dein GROUP BY siehst du "nur" 2 zeilen es sind aber 6 bei 10 und 2 bei 11.
Bildlich:
sell | buy
uid|price || uid|price
2 |10 || 1 |10
| || 15 |10
| || 20 |10
10 |10 || 1 |10
| || 15 |10
| || 20 |10
Und als tip falls das ein Aktienspiel wird ;) und du mit 1000enden einträgen rechnest, investier zeit und beschäftige dich mit der Planung
deiner DB und arbeite mit simulierten 1000enden einträgen.
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Vielen Dank für den Hinweis. Ich habe die Chance genutzt und meine Tabellenstruktur geändert, so dass jede Order in der Tabelle ex_transfer landen. Ich war auch ein wenig am experimentieren, tolle Ergebnisse gehabt und doch beim Feintuning tritt ein Fehlerchen auf.
PHP-Code:
$sell = "SELECT ex_transfer.stock_id, ex_transfer.stockprice, ex_transfer.order, SUM(ex_transfer.endvalue) AS selldigit ".
"FROM ex_transfer WHERE ex_transfer.order='1' ".
"GROUP BY ex_transfer.stockprice ";
$buy = "SELECT ex_transfer.stock_id, ex_transfer.stockprice, ex_transfer.order, SUM(ex_transfer.endvalue) AS buydigit ".
"FROM ex_transfer WHERE ex_transfer.order='0' ".
"GROUP BY ex_transfer.stockprice ";
Die Fehlermeldung lautet
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1"
Ich gestehe, den Fehler nicht zu verstehen. Sicher eine Lücke, die ich noch füllen muss.
Weiß jemand Rat. An sich habe ich hier eine klare strukturelle Vorstellung, wie ich was machen muss bzw. soll. Aber es hakt doch ein bisschen an fehlender Erfahrung.
Da subtrahierst du ein STRING von einem anderen und dann
willst du das Ergebnis als Query abschicken?
Zitat:
$result = mysql_query($wert) or die(mysql_error());
Selbst wenn du $sell und $buy als Query's absetzt erhälst du ein Array
als Ergebnis welches du auch nicht subtrahieren kannst.
Zitat:
Ich habe die Chance genutzt und meine Tabellenstruktur geändert, so dass jede Order in der Tabelle ex_transfer landen.
Vielleicht solltest erstmal lernen wie man eine Datenbankstruktur plant.
Sie dann umsetzen und dann erst die Anwendungsschicht planen/umsetzen.
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!