Kemas kini menggunakan berbilang JOIN dalam MySQL/Python
P粉512526720
P粉512526720 2023-09-12 21:19:12
0
1
846

Batch pertama soalan dianggap terlalu serupa dengan siaran lain (bukan) dan telah ditutup... jadi saya telah membuat satu lagi percubaan di sini, semoga perkataan yang lebih baik kali ini.

Sesetengah latar belakang: Kami mempunyai hubungan di sini. Sekuriti (syiling) + mata wang (syiling asas) membentuk pasangan. Sepasang dan broker membentuk aset (saya menganggap setiap broker/pasangan sebagai aset tertentu)

Saya juga mempunyai jadual pertukaran asing yang menyimpan kadar pertukaran mata wang masa nyata.

Dalam jadual sejarah transaksi saya (history_price), terdapat lajur yang mengandungi banyak NULL (volume Euro), yang saya kira berdasarkan volum. Apa yang saya mahu lakukan ialah mengisinya, dan untuk melakukan ini saya perlu (untuk setiap baris NULL):

Begini cara saya membahagikan pertanyaan:

1-Cari mata wang

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-Cari kadar pertukaran

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

3-Kemas kini ruangan Euro

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

4- Masukkan 2 ke dalam 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- Masukkan 1 ke dalam 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;

Ia berfungsi, tetapi terlalu perlahan... Adakah terdapat cara untuk mengoptimumkannya dan menjadikannya lebih pantas?

P粉512526720
P粉512526720

membalas semua(1)
P粉105971514

Gunakan JOIN bukannya subkueri berkorelasi.

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan