suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Aktualisieren Sie mit mehreren JOINs in MySQL/Python

Die ersten Fragen wurden als zu ähnlich zu einem anderen Beitrag angesehen (was nicht der Fall war) und wurden geschlossen ... also habe ich hier einen weiteren Versuch unternommen, diesmal hoffentlich besser formuliert.

Einige Hintergrundinformationen: Wir haben hier eine Beziehung. Wertpapiere (Coins) + Währungen (Basiscoins) bilden ein Paar. Ein Paar und ein Broker bilden einen Vermögenswert (ich behandle jeden Broker/jedes Paar als einen bestimmten Vermögenswert)

Ich habe auch eine Wechselkurstabelle, in der Wechselkurse in Echtzeit gespeichert sind.

In meiner Transaktionsverlaufstabelle (history_price) gibt es eine Spalte, die viele NULL-Werte (Euro-Volumen) enthält, die ich anhand des Volumens berechne. Ich möchte es füllen, und dazu muss ich (für jede NULL-Zeile) Folgendes tun:

So segmentiere ich die Abfrage:

1-Währung finden

SELECT `history_price`.`param_basecoin`.`Symbol` 
FROM `history_price`.`param_asset` 
INNER JOIN `param_pair` ON `history_price`.`param_asset`.`id_pair` = `history_price`.`param_pair`.`pair_id` 
INNER JOIN `history_price`.`param_basecoin` ON `history_price`.`param_pair`.`Coin2_id` = `history_price`.`param_basecoin`.`basecoin_id` 
WHERE `history_price`.`param_asset`.`Ticker` LIKE '???'

2-Wechselkurse finden

SELECT `Rate` 
FROM `history_price`.`param_forex` 
WHERE `Coin` LIKE '???' AND `Basecoin` LIKE 'EUR'

3-Euro-Kolumne aktualisieren

UPDATE `history_price` 
SET `history_price`.`eur_v` = (`history_price`.`Basecoin_v` * ???) 
WHERE `history_price`.`eur_v` IS NULL

4- Fügen Sie 2 in 3 ein

UPDATE `history_price` 
SET `history_price`.`eur_v` = (`history_price`.`Basecoin_v` * (SELECT `Rate` FROM `history_price`.`param_forex` WHERE `Coin` LIKE '???' AND `Basecoin` LIKE 'EUR')) 
WHERE `history_price`.`eur_v` IS NULL

5- Füge 1 in 4 ein

UPDATE `history_price` 
SET `history_price`.`eur_v` = (`history_price`.`Basecoin_v` * (
    SELECT `Rate` 
    FROM `history_price`.`param_forex` 
    WHERE `Coin` LIKE (
        SELECT `history_price`.`param_basecoin`.`Symbol` 
        FROM `history_price`.`param_asset` 
        INNER JOIN `param_pair` ON `history_price`.`param_asset`.`id_pair` = `history_price`.`param_pair`.`pair_id` 
        INNER JOIN `history_price`.`param_basecoin` ON `history_price`.`param_pair`.`Coin2_id` = `history_price`.`param_basecoin`.`basecoin_id` 
        WHERE `history_price`.`param_asset`.`Ticker` LIKE `history_price`.`Ticker`
        ) 
        AND `Basecoin` LIKE 'EUR'
        )
    ) 
WHERE `history_price`.`eur_v` IS NULL;

Es funktioniert, aber zu langsam... Gibt es eine Möglichkeit, es zu optimieren und schneller zu machen?

P粉512526720P粉512526720479 Tage vor887

Antworte allen(1)Ich werde antworten

  • P粉105971514

    P粉1059715142023-09-13 00:06:37

    使用JOIN而不是相关子查询。

    UPDATE history_price AS hp
    JOIN param_asset AS pa ON pa.Ticker = hp.Ticker
    JOIN param_pair AS pp ON pp.id_pair = pa.id_pair
    JOIN param_basecoin AS pb ON pb.basecoin_id = pp.Coin2_id
    JOIN param_forex AS pf ON pf.Coin = pb.Symbol
    SET hp.eur_v = hp.Basecoin_v * pf.Rate
    WHERE pf.Basecoin = 'EUR' AND hp.eur_v IS NULL

    Antwort
    0
  • StornierenAntwort