mysql: Zwei Tabellen mit werktäglichen und wöchentlichen Daten abfragen

ms1110

Grünschnabel
In einer Abfrage möchte ich zwei Tabellen verbinden. Eine davon enthält werktägliche Einträge, die andere nur wöchentliche. Ich möchte alle werktäglichen Einträge aus Tabelle prices ausgeben und wo es wöchentliche aus Tablle cot-data gibt, sollen diese am entsprechenden Tag zusätzlich ausgegeben werden. Z.B. für 28., 27. und 26. sollen also nur die Werte für update_date und sett ausgegeben werden, für den 25. update_date, sett und comshort usw.

tables.png

Allerdings bekomme ich nur die Daten, wo auch Einträge in Tabelle cot-data vorhanden sind.
Meine Abfrage sieht so aus:
PHP:
$query =   "SELECT * FROM `prices`
            LEFT JOIN `prices`
            ON `prices`.`update_date` = `cot-data`.`update_date`
            WHERE `prices`.`market_id` = '10'
            AND `prices`.`act_contract` = 'act'
            AND `cot-data`.`market_id` = '10'
            ";
Ich habe alle Arten von JOIN ausprobiert, bekomme aber immer nur die wöchentlichen Daten. Wo stehe ich auf dem Schlauch?
 
Zuletzt bearbeitet:
Keine Ahnung wie es mit JOIN geht, aber mit einer Subquery ist es kein Problem:
Code:
SELECT *,
    (select comshort
        from `cot-data`
        where update_date=prices.update_date)
FROM `prices` WHERE 1
 
Das wäre eine gute Lösung, wenn die Unterabfrage nur einen Wert ausspucken müsste. Es sind aber viele. Daher kommt Fehler 1242.
 
Möglicher Weise hilft es , die market_id in das where der Subquery einzubeziehen. Ich hatte nur mit der market_id 10 getestet, wie in deinen Beispieltabellen.
 
Auch das bringt wieder 1242. Ich brauche eine Lösung, die viele Ergebnisse zulässt und das jeweilige Datum als Verbindung nutzt.
 
Nein, für ein Datum gibt es nur einmal comshort. es gibt noch weitere Datensätze wie comlong, aber die frage ich ja nicht ab.
 
Hm, dann verstehe ich den Fehler mit dem Mehrfach-Ergebnis nicht. Ich habe in meiner Testkonfiguration eine zweite market_id eingefügt und die Abfrage erweitert. Funktioniert einwandfrei.
SQL:
SELECT *,
(select comshort from `cot-data` where market_id=prices.market_id and update_date=prices.update_date)
FROM `prices` WHERE 1
 
Mit Deiner Lösung funktioniert es bei mir jetzt auch, vielen Dank!!
Allerdings muss ich in der php-abfrage für comshort jetzt den ganzen select einbauen (select comshort from `cot-data` where market_id=prices.market_id and update_date=prices.update_date) Gibt es da eine elegantere Lösung?
Zur Erläuterung, das ist der Select:
PHP:
"SELECT *,
            (select comshort from `cot-data` where market_id=prices.market_id and update_date=prices.update_date)
            FROM `prices` WHERE `act_contract` = 'act' AND `market_id`= '10'
            ";

Und das ist dann die Umwandlung in einen Array:
PHP:
 while($row = $result->fetch_assoc()) {
    $jsonArrayItem = array();
    $jsonArrayItem['TIMESTAMP'] = $row['update_date'];
    $jsonArrayItem['OPEN'] = $row['open'];
    $jsonArrayItem['HIGH'] = $row['high'];
    $jsonArrayItem['LOW'] = $row['low'];
    $jsonArrayItem['CLOSE'] = $row['sett'];
    $jsonArrayItem['TURNOVER'] = $row['est_volume'];
    $jsonArrayItem['CONTRACT'] = $row['contract_id'];
    $jsonArrayItem['COMSHORT'] = $row['(select comshort from `cot-data` where market_id=prices.market_id and update_date=prices.update_date)'];
 
Zuletzt bearbeitet:
Im Prinzip ist eine Subquery ja nichts schlechtes, man liest jedoch, dass ein Join von der DB-Software besser optimiert werden kann, was von Vorteil ist.
Sicher meldet sich noch jemand anders, z. B. Yaslaw, der eine Lösung mit Join angeben kann.
 
Zurück