SELECT *
FROM (
SELECT YEAR(`date`) AS `year`, MONTH(`date`) AS `month`
FROM `table1`
UNION SELECT YEAR(`date`) AS `year`, MONTH(`date`) AS `month`
FROM `table2`
) AS `d`
JOIN (
SELECT YEAR(`date`) AS `year`, MONTH(`date`) AS `month`, COUNT(*)
FROM `table1`
WHERE `date` BETWEEN :first_date AND :last_date
GROUP BY `year`, `month`
) AS `t1` ON `t1`.`year` = `d`.`year` AND `t1`.`month` = `d`.`month`
...
SELECT *
FROM (
SELECT YEAR(`date`) AS `year`, MONTH(`date`) AS `month`, COUNT(*)
FROM `table1`
WHERE `date` BETWEEN :first_date AND :last_date
GROUP BY `year`, `month`
) AS `t1`
JOIN (
SELECT YEAR(`date`) AS `year`, MONTH(`date`) AS `month`, COUNT(*)
FROM `table2`
WHERE `date` BETWEEN :first_date AND :last_date
GROUP BY `year`, `month`
) AS `t2` ON `t2`.`year` = `t1`.`year` AND `t2`.`month` = `t1`.`month`
<ul onclick="console.log(event.target.getAttribute('data-value'))">
<li data-value="1">Test 1</li>
<li data-value="2">Test 2</li>
</ul>