SELECT TOP 1 f1.forum_name + 1 AS free_name
FROM
hs_forums AS f1
LEFT OUTER JOIN hs_forums AS f2 ON f1.forum_name + 1 = f2.forum_name
LEFT OUTER JOIN hs_registrations AS r ON f1.forum_name = r.forum_name
WHERE f2.forum_name IS NULL AND r.forum_name IS NULL
Из таблицы hs_forums берутся все числа forum_name (псевдоним f1), например 1, 2, 3, 6, 7. В этой же таблице для каждого значения forum_name ищется значение forum_name + 1 - если находится, то к результатирующему кортежу добавляется найденное значение, иначе NULL: (1, 2), (2, 3), (3, NULL), (6, 7), (7, NULL). Затем аналогичным образом добавляются значения из hs_registrations - тоже равные искомому forum_name + 1. Пусть в hs_registrations хранится 2, 3, 4, 6, 7. Получается (1, 2, 2), (2, 3, 3), (3, NULL, 4), (6, 7, 7), (7, NULL, NULL).
Под условия выборки попадает значение 7, поэтому ответ 8. Проблема заключается в пропуске значения 5. Как эта проблема образуется? Если у нас в hs_forums есть большая "дырка" в последовательности, например, 1, 10 - "дырка" 2...9, мы получаем первое подходящее значение 3. Допустим, что в hs_registrations находится только 5 - тогда 3 полностью подходит в качестве ответа, и этот случай не вызывает проблему. Проблему вызывает случай, когда в hs_registrations находится 3, тогда подходящим ответом будет 4. А если hs_registrations содержит 3, 4, то подходящим ответом будет 5.
Всегда ответом является число, на 1 больше любого из чисел в полном соединении двух таблиц. Отсюда решение.
SELECT TOP 1 n.forum_name + 1 AS free_name
FROM
(SELECT COALESCE(f.forum_name, r.forum_name) AS forum_name
FROM hs_forums AS f FULL OUTER JOIN hs_registrations AS r ON f.forum_name = r.forum_name
WHERE f.forum_name IS NOT NULL OR r.forum_name IS NOT NULL) n
LEFT OUTER JOIN hs_forums AS f1 ON n.forum_name + 1 = f1.forum_name
LEFT OUTER JOIN hs_registrations AS r ON n.forum_name = r.forum_name
WHERE f1.forum_name IS NULL AND r.forum_name IS NULL
Не проверял, чистые рассуждения.
P.S. Не знаю, есть ли в MySQL FULL JOIN (это LEFT и RIGHT одновременно), но его несложно сконструировать, если таковой отсутствует. TOP 1 в T-SQL эквивалентен LIMIT 1 в MySQL. Функция COALESCE - стандартная из SQL-92, поэтому скорее всего в MySQL тоже имеется (возвращает первое не-NULL значение из своих аргументов).