Le premier lot de questions a été jugé trop similaire à un autre message (ce n'était pas le cas) et fermé... j'ai donc fait une autre tentative ici, j'espère mieux formulée cette fois.
Un peu de contexte : nous avons une relation ici. Les titres (pièces) + les devises (pièces de base) forment une paire. Une paire et un courtier forment un atout (je traite chaque courtier/paire comme un atout spécifique)
J'ai également une table de change qui stocke les taux de change en temps réel.
Dans ma table d'historique des transactions (history_price), il y a une colonne qui contient beaucoup de NULL (volume en euros), que je calcule en fonction du volume. Ce que je veux faire, c'est le remplir, et pour ce faire, je dois (pour chaque ligne NULL) :
Voici comment je segmente la requête :
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 '???'
SELECT `Rate` FROM `history_price`.`param_forex` WHERE `Coin` LIKE '???' AND `Basecoin` LIKE 'EUR'
UPDATE `history_price` SET `history_price`.`eur_v` = (`history_price`.`Basecoin_v` * ???) WHERE `history_price`.`eur_v` IS NULL
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
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;
Cela fonctionne, mais trop lent... Existe-t-il un moyen de l'optimiser et de le rendre plus rapide ?
Utilisez
JOIN
au lieu de la sous-requête corrélée.