SELECT uid, ifnull(sum(level), 0) AS level, ifnull(sum(mileage), 0) AS mileage, ifnull(sum(complaint_cnt), 0) AS complaint_cnt FROM ( SELECT *, NULL AS mileage, NULL AS complaint_cnt FROM a UNION SELECT b.uid, NULL AS level, b.mileage, NULL AS complaint_cnt FROM b UNION SELECT c.uid, NULL AS level, NULL AS mileage, c.complaint_cnt FROM c) tmp GROUP BY uid