cari

Rumah  >  Soal Jawab  >  teks badan

Kemas kini menggunakan berbilang JOIN dalam MySQL/Python

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粉512526720P粉512526720480 hari yang lalu894

membalas semua(1)saya akan balas

  • P粉105971514

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

    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

    balas
    0
  • Batalbalas