ゼロ行を返す理由は、table_1の値でグループ化しているためです。 table_1には値がないため、返す行はありません。別の言い方をすれば、GROUP BYからクエリでt1.any_colを返した場合は、次のようになります。
SELECT `t1`.`any_col`, COUNT(`t2`.`name`)
FROM `table_1` `t1`
LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id`
WHERE `t1`.`another_column` = 123
GROUP BY `t1`.`any_col`
行がない場合、t1.any_colには何が表示されますか?必要なことを実現する唯一の方法は、table_1に行がないかどうかをチェックする別のクエリと結果を結合することです。この例では、INFORMATION_SCHEMAビューを使用して、クエリを実行できるものを用意しています。
SELECT COUNT(`t2`.`name`)
FROM `table_1` `t1`
LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id`
WHERE `t1`.`another_column` = 123
GROUP BY `t1`.`any_col`
UNION ALL
SELECT 0
FROM INFORMATION_SCHEMA.TABLES
Where Not Exists( Select 1 From `table_1` )
LIMIT 1