Роми, если у вас в таблице только булевые значения, вернее дискретно 1 и 0, то вариант Slava Rozhnev - частный случай векторизации, пусть и грубоватый, но в данном случае упращения дают пользу по профиту со скоростью
При сортировке используем сравнение параметров с желаемым профилем. При необходимости можно использовать различные коэффициенты для различных параметров
Роми чтоб было понятнее, тут происходит следующее. Значение операции сравнения приводится к 1 или 0, далее вычисляется сумма. Чем больше будет совпадений, тем большее значение будет у суммы. А зная эту сумму, можно отсортировать по убыванию. Таким образом сверху будут наиболее подходящие записи. Единственном тут надо исключить запись изначального юзера, чтоб не мешалась. Сам же запрос строится на основе данных флагов нужного юзера. В качестве флагов может быть что угодно. Так-же можно умножать не на 1, а на промежуточное значение между от 0 до 1, таким образом можно балансировать важность тех или иных флагов.
Роми, сравнение в MySQL дает резулбтат 0 или 1. Соответственно в нашем случае если flag1 равен единице то (flag1=1)*1 будет тоже равно единице. При совпадении всех 4х флагов получим максимальный вариант - 4. Так, как сортировка по убываию то следом будет строка с 3-мя совпадениями и т. д.
Оно не соответствует требованиям нормализации. Впрочем, предметная область не определена, потому нельзя сказать, оправдана нормализация или нет. Если нет - то решение действительно типовое.