Сначала покритикую структуру базы.
Динамические таблицы имеет смысл создавать только если у них будут наборы полей, которые нельзя определить на этапе проектирования. И делать это нужно только в крайних случаях.
В данном случае нужно было создать одну таблицу (id, title, date), в которую добавить поле "table_id", в котором хранить id таблицы. В другой таблице "table_names" хранить эти id + имена таблиц + дополнительную информацию.
Тогда ответом на вопрос будет один
относительно простой запрос с GROUP BY.
По существу вопроса: придется делать 20 динамических запросов:
SELECT * FROM table_name1 ORDER BY date DESC LIMIT 1
, затем объединять ответы в UNION. Это неэффективно и трудоемко.