172 похожих чатов

SELECT u1.id, u1.parent_id, 0 as referrals FROM users u1 WHERE

parent_id != 0
UNION
SELECT u.id, u.parent_id, rf.id as referrals
FROM referral rf, users u
WHERE rf.parent_id = u.id
)
select * from referral

о, я сделал такое, но появилась проблема что родитель у которого много детей, появляется в запросе много раз, что логично, UNION решал это, но сейчас как появилось поле referrals, логично что не работает, можно как то этот referrals сгрупировать в массив?

20 ответов

19 просмотров
🌑- Автор вопроса

Нет,нету. Просто два поля, Id и parent_Id, любой юзер ссылается на parent_id, если он есть, если нету то parent_id = 0, а что не так в моем коде? Почему вы сказали про моделб

🌑- Автор вопроса

Структуру я хотел сделать такую, что будет id, и его referrals, referrals массив из всех юзеров у которых parent_id = id, а дальше если и у них есть дети, то они будут в выборке тоже как родители с их referrals, по сути выборка которуюя сделал,но referrals сделать массивом и обьединить

🌑
Нет,нету. Просто два поля, Id и parent_Id, любой ю...

Не так то, что она не консистентная — возможны ссылки на несуществующих пользователей (да и пользователя с id = 0 на самом деле не существует). Некачественная модель, короче. ;)

🌑- Автор вопроса
Yaroslav Schekin
Не так то, что она не консистентная — возможны ссы...

я бы сделал parent_id null, если его нет, но человек решил сделать 0)

🌑- Автор вопроса
Дмитрий Копытов
И теперь это невозможно исправить?

я не отвечаю вообще за базу, за бек, не в моих полномочиях короче)

🌑
Структуру я хотел сделать такую, что будет id, и е...

Я ничего не понял. :( Вы можете привести текстом адекватный пример данных и результата на этих данных? > но в топ парент находится сам он, с чем это может быть связано? С тем, что я считаю, что он и есть top_parent, и явно это написал в запросе. ;) > то они будут в выборке тоже как родители с их referrals Т.е. это всего один уровень для каждого родителя (тогда зачем тут rCTE)? Или я не так понял?

🌑
я бы сделал parent_id null, если его нет, но челов...

И получил "прекрасный" побочный эффект — теперь можно ссылаться на несуществующих пользователей. :(

🌑- Автор вопроса
Yaroslav Schekin
Я ничего не понял. :( Вы можете привести текстом а...

id parent_id 1 0 2 1 3 1 4 1 5 4 6 5 7 4 8 7 результатом будет id referrals 1 [2,3,4] 4 [5,7] 5 [6] 7 [8]

🌑- Автор вопроса
🌑
id parent_id 1 0 2 1 3 1 4 1 5 4 6 5 7 4 8 ...

и по сути для данной структуры уже не нужна рекурсия))), я просто понял что выборка такая будет легче и лучше, сначала я думал будет вложенность в глубь и там нужна была рекурсия, извините за потраченное время

🌑
id parent_id 1 0 2 1 3 1 4 1 5 4 6 5 7 4 8 ...

Так rCTE тут не нужно, вроде: SELECT u.id, array_agg(child.id ORDER BY child.id) AS referrals FROM users AS u JOIN users AS child ON child.parent_id = u.id WHERE EXISTS ( SELECT 1 FROM users AS ue WHERE ue.parent_id = u.id ) GROUP BY u.id;

🌑- Автор вопроса
Yaroslav Schekin
Так rCTE тут не нужно, вроде: SELECT u.id, array_a...

вот я о том же, просто понял что рекурсия нужна была бы если эта же структура шла в глубь, но это очень глупо и непрактично, спасибо за выборку!

🌑
а зачем where exists?

От предыдущего запроса осталось. ;)

🌑- Автор вопроса
Yaroslav Schekin
Так rCTE тут не нужно, вроде: SELECT u.id, array_a...

возник вопрос, если мне нужно будет добавить поле referrals_length в котором будет лежать количество рефераллов до n-ой глубины, то тут же уже нужна рекурсия?

🌑- Автор вопроса
Андрей Никитин
Если n константа, то нет

в плане? имеете ввиду что если n будет прокидываться снаружи, то рекурсия не нужна?

🌑
в плане? имеете ввиду что если n будет прокидывать...

Нет, если n - это число всегда постоянная и никогда не меняется, то рекурсия ненужна

В общем случае да. Если n — [небольшая] константа, то можно и "расписать" уровни вручную вместо рекурсии... но зачем, казалось бы? ;)

🌑- Автор вопроса
Yaroslav Schekin
В общем случае да. Если n — [небольшая] константа,...

понял, спасибо, пойду пробовать написать

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта