在 MySQL / Python 中使用多个 JOIN 进行更新
P粉512526720
P粉512526720 2023-09-12 21:19:12
0
1
867

第一批问题被认为与另一篇文章太相似(事实并非如此)并被关闭...所以我在这里进行了另一次尝试,希望这次措辞更好。

一些背景:这里我们有关系。 证券(硬币)+ 货币(基础币)形成一对。 一对和经纪人形成资产(我将每个经纪人/对视为特定资产)

我还有一个外汇表,用于存储实时货币汇率。

在我的交易历史表(history_price)中,有一列包含大量 NULL(欧元交易量),我根据交易量进行计算。我想做的就是填充它,为此我必须(对于每个 NULL 行):

以下是我对查询进行分段的方式:

1-查找货币

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-查找汇率

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

3-更新欧元列

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

4- 将 2 插入 3

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- 将 1 插入 4

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;

它确实有效,但是太慢了...... 有没有办法优化它并使其更快?

P粉512526720
P粉512526720

全部回复(1)
P粉105971514

使用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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板