Un union
se adaptaría a tu problema. Se requiere algún masaje de datos para dar a ambos lados de la unión el mismo número y tipo de columnas:
select group_id
, id as item_id
, name
, description
, source_table
from (
select id
, user_id
, group_id
, name
, description
, 'from table1' source_table
from table1
union all
select id
, user_id
, group_id
, name
, description
, 'from table2' -- Column name is already defined above
from table2
) as SubQueriesMustBeNamed
where user_id = 1
order by
group_id
, name
Ejemplo de trabajo en SQL Fiddle.
Para formatear el conjunto de resultados como desee, itere sobre el conjunto de resultados. Cuando el group_id
cambios, imprima un # Group N #
encabezado.
No debería haber necesidad de tener otros bucles o iteraciones del lado del cliente, solo un foreach
o equivalente sobre el conjunto de filas devueltas por la consulta.