select u.id user_id, u2.id refer_id, u.l from (
select u.id, login, ref, level as l
from users u
start with ref is null
connect by prior q.login = q.ref
) u left join users u2 on u2.login = u.ref
order by u.id
jekahm: как вы собирались выводить записи за последние три часа, если у вас, по сути, есть только записи за сутки? Вам нужно сначала с исходными данными разобраться.
Денис: Вы привели пример: "Человек ищет сервер minecraft, и выбрал моды "с PvP"". Я это понял так, что у мода есть аттрибут - пвп он или нет. Как вы собирались определять, какие моды для пвп, какие - нет?
Денис: Весь смысл здесь именно в таблице связи. Погуглите про это, если я не понятно объяснил.
У вас параметры поиска довольно четкие - нет текстового поиска, поиска каких-то похожих статей и т.п - поэтому вполне реально по ним построить архитектуру БД.
Николай Бараненко: 3300 - это прилично. Но проблема, как мне кажется, не с кодом, а с БД.
Есть дока ( docs.oracle.com/cd/B10501_01/server.920/a96521/ds_txns.htm#99 ) по распределенным транзакциям, отслеживайте выполнение процедуры, смотрите, есть ли транзакции в DBA_2PC_PENDING, проверяйте параметр DISTRIBUTED_TRANSACTION в конечной БД.
create or replace trigger %trigger_name%
after update
on %table_name%
begin
if :NEW.%column_name% <> :OLD.%column_name%
then write_log(:NEW.%column_name%);
else return;
end if;
end;
Так делают, когда в сущности, которая используется для связи, добавляют какую-то о ней (связи) информацию. Неплохой пример с заказом номеров в отеле есть тут: https://habrahabr.ru/post/193380/
Это можно сделать на sql, но крайне костыльно - надо будет генерить полный список от 0 до n (взависимости от того, какое максимальное и минимальное значение в таблице) и джойнить его с искомымми данными.