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 ответов

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

Нет,нету. Просто два поля, 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)

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

И теперь это невозможно исправить?

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

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

🌑
Структуру я хотел сделать такую, что будет 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 — [небольшая] константа,...

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

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

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

generic procedure function test<T>(param: T); type case T of longint: NewT = word; longword: NewT = byte; end; var v1: NewT; Как это можно сделать? Чтобы у меня...
notme
20
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
Делал задачу вот такую https://stepik.org/lesson/4985/step/9?unit=1083 получилось такое https://play.haskell.org/saved/ipKrepqe оно работает, тестов много не писал, но работае...
Fedor
22
Всем привет, все время юзал бандлы, но появилась задача по базовому образу и команда werf build не пушит образ werf build --config='./root/werf.yaml' --repo ${CI_REGISTRY_IMAG...
Илья Корж
4
Похоже опять туплю задача https://stepik.org/lesson/5431/step/8?unit=1132 код и его работа https://play.haskell.org/saved/lmYTShXM на мой взгляд все правильно, и даже избыто...
Fedor
8
Всем привет, подскажите, пожалуйста, сколько живет connection к рэббиту, могу ли я использовать один инстанс подключения? Если да, то считается ли это хорошей практикой? Вот п...
Sergey
3
что-то я не понимаю, в линуксе отладочную информацию как убрать из бинаря? он что с этой опцией, что без - одного и того же (достаточно большого) размера (да, я про лазарь)
Iluha Companets
13
Hey Does anyone know how can I receive push notifications from Github on my account? The official Github android app doesn't send notifications, and I don't use the email bec...
Jacob
10
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
58
задача какая - что ты дальше с этой переменно будешь делать? Чем вот так не устраивает? var v1: T;
Александр (Rouse_) Багель
6
Карта сайта