Вы можете сделать это, создав набор пользователей, который соответствует критериям из таблиц вашего профиля, примерно так:
SELECT FK_USERS_ID
FROM Profiles
WHERE topic='x'
AND TOPIC_ID IN (1,2)
GROUP BY FK_USERS_ID
HAVING COUNT(1) = 2
Здесь вы перечисляете своих пользователей, которые соответствуют темам, которые вам нужны. Группируя по идентификатору пользователя и указав количество строк, которые должны быть возвращены, вы можете фактически сказать «только те, которые имеют x и y в теме z. Просто убедитесь, что COUNT (1) = x имеет одинаковое количество различных TOPIC_ID для поиска.
Затем вы можете запросить таблицу пользователя
SELECT ID
FROM Users
WHERE name like '%PAU%'
AND ID IN (<insert above query here>)
Вы также можете сделать это в соединении и производной таблице, но суть должна быть объяснена выше.
EDIT:
если вы ищете несколько комбинаций, вы можете использовать многостолбцевую строку mysql IN:
SELECT FK_USERS_ID
FROM Profiles
WHERE (topic,topic_id) IN (('x',3),('x',5),('y',3),('y',6))
GROUP BY FK_USERS_ID
HAVING COUNT(1) = 4
Это будет искать варианты использования пар x-3, x-5, y-3 и y-6.
Вы должны иметь возможность легко создавать пары topic-topic_id в php и вставлять их в строку SQL, а также просто подсчитывать количество сгенерированных вами пар в переменную для использования для числа count (1). См. http://www.mysqlperformanceblog.com/2008/04/04/multi-column-in-clause-unexpected-mysql-issue/ для обсуждения производительности с использованием этого подхода.