В чём проблема сделать 2 запроса? Зачем "извращения" с SQL'ем?
Хех ну если так хочется...
$result = $conn->query('
(
select id, name, "head" as table_name
from head
) union (
select id, name, "body" as table_name
from body
)
');
while ($row = $result->fetch_assoc()) {
$tableName = $row['table_name'];
unset($row['table_name']);
$arr[$tableName][] = $row;
}
$result->free();
Но такое прокатит только если head.id и body.id имеют одинаковый тип, а так же head.name и body.name тоже имеют одинаковый тип.