UNION ALL vs CASE - SQL query optimization
Plan A -- no useful indexes:

Do the CASE approach.

Reason:  It is a single pass over the data.

PS:  SUM(approved = 1) is more concise, possibly faster.

Plan B -- useful indexes:

Do the UNION ALL approach if you have this composite index:

INDEX(approved, deleted_at)


and don't do COUNT(id), instead do COUNT(*).

That can be done in range scans on that one index.  The index is smaller than the table and each count only needs to scan part of the index.

Furthermore, UNION ALL is better optimized in 5.7 / 10.1.  So upgrade if you are not there yet.