Немного не догоняю.
Одним запросом:
select ads.id, ads_meta.text, ads_images.path ...
from ads, ads_images, ads_meta
where ads_images.ads_id=ads.id and ads_meta.ads_id=ads.id
order by ads.id
открыть запрос и внутри него пробежать по всем записям в цикле, внутри которого сравнивать текущее значение ads.id со значением на предыдущем шаге, и основываясь на этом формировать вывод или анализ.
Если будете разбивать на несколько запросов , то все равно объем информации пересылаемой с сервера БД не уменьшиться, да и на клиенте придется держать доп массивы, чтобы сохранять данные для будущих сравнений в IN-выражениях.
P.S. Экзотика:
1)Создайте таблицу ads_exotic ( ads_id, ads_meta_data, ads_images_data)
2) Заведите триггеры на модификацию таблиц ads_meta и ads_images, которые будут редактировать поля ads_meta_data и ads_images_data (допустим, добавляя/удаляя/изменяя через разделители отмодифицированные данные)
Ну и позже банально select * from ads_exotic where ads_id=X
Но это противоречит правилам нормализации БД.