Уверен, что задача простая, но я никак не соображу.
Абсолютно напрасно, задачи с деревьями довольно сложны.
Предположим есть следующая структура в таблице БД.
Users
1.id
2.name
3.affiliated_by
Это
неподходящая структура для хранения деревьев.
Пост на хабре, в котором описаны различные варианты хранения деревьев в БД. Там и запросы указаны, которым эти данные можно легко и быстро получить.
Для вашей структуры придется вытащить всех пользователей из БД и потом вручную с помощью рекурсии построить цепочку. Примерно так:
function buildAffiliateChain($for, $users) {
$chain = [];
$affiliatedUsers = array_values(array_filter($users, function($user) use ($for) {
return $user['affiliated_by'] === $for;
}));
foreach ($affiliatedUsers as $affiliatedUser) {
$subscequentChain = buildAffiliateChain($affiliatedUser['id'], $users);
$chain = array_merge($chain, [$affiliatedUser], $subscequentChain);
}
usort($chain, function($someUser, $otherUser) {
return $someUser['affiliated_by'] > $otherUser['affiliated_by'] ? 1 : -1;
});
return $chain;
}
Если количество пользователей будет измеряться тысячами, то подобный алгоритм будет крайне неэффективен. На малых объемах проблем не будет.
PS Рекурсию
можно использовать и в поcледних версиях MySQL, так что аналогичным способом можно решить вопрос и на уровне БД. Однако производительность от этого не вырастест.