MySQL子查询
第一次看这样的子查询,explain第一次分析语句的时候感觉受影响行数还是比较少的,至少相对于下面的连接查询,
SELECT
t.t_date AS 'reportdate',
t.game_id,
t.platform,
t.source,
CASE t.data_type
WHEN 'open' THEN
FLOOR(t.dev_num * 0.9)
ELSE
t.dev_num
END AS 'start_num',
(
SELECT
FLOOR(x.dev_num * 0.8)
FROM
res_md_device_report x
WHERE
x.data_type = 'activate'
AND x.type = t.type
AND x.game_id = t.game_id
AND x.source = t.source
AND x.platform = t.platform
AND t.t_date = x.t_date
) AS 'activate_num'
FROM
`res_md_device_report` t
WHERE 1 = 1 {$cond}
AND type = 1
AND data_type = 'open'
ORDER BY
t_date DESC
LIMIT $index,$rows
连接查询:
SELECT bt.t_date,bt.platform,bt.game_id,bt.source,bt.dev_num AS open_num, tt1.dev_num AS active_num, tt1.dev_num AS togame_nu FROM (SELECT t_date,platform,game_id,source,dev_num,type FROM `res_md_device_report` WHERE 1 = 1 AND type = 1 AND data_type = 'open' ORDER BY t_date LIMIT 10) AS bt LEFT JOIN (SELECT * FROM `res_md_device_report` WHERE data_type='active') AS tt1 ON bt.t_date=tt1.t_date AND bt.platform=tt1.platform AND bt.game_id=tt1.game_id AND bt.source=tt1.source AND bt.type=tt1.type LEFT JOIN (SELECT * FROM `res_md_device_report` WHERE data_type='togame') AS tt2 ON bt.t_date=tt2.t_date AND bt.platform=tt2.platform AND bt.game_id=tt2.game_id AND bt.source=tt2.source AND bt.type=tt2.type
还待测试,
子查询测试结果:
连接查询结果就不贴了,以我的写法肯定会扫面全表的。200多万行记录。

浙公网安备 33010602011771号