Why not simply join the market_index
table?
SELECT
com.trading_code,
com.business_segment_id,
dmkt.close_price,
dmkt.cdate,
dmkt.turnover,
dmkt.volume,
sh.total_no_share,
mi.cdate
IF(dmkt.close_price IS NULL,
((SELECT
close_price
FROM
daily_mkt_status
WHERE
trading_code = com.trading_code
AND cdate <= mi.cdate
ORDER BY cdate DESC
LIMIT 1) * sh.total_no_share),
(dmkt.close_price * sh.total_no_share)) AS mcap
FROM
company AS com
JOIN market_index AS mi
LEFT JOIN daily_mkt_status AS dmkt ON (
com.trading_code = dmkt.trading_code
AND dmkt.cdate = mi.cdate
)
LEFT JOIN share_info AS sh ON (com.trading_code = sh.trading_code)
You might want to add a GROUP BY
clause as well just to get rid of unnecessary duplicates