Я использую драгоценный камень предков, чтобы помочь организовать древовидную структуру моего приложения в базе данных. Он в основном записывает информацию о предках потомков в специальный столбец, называемый «предок». Столбец предков для конкретного ребенка может выглядеть как «1/34/87», где родитель этого ребенка - 87, а затем родитель 87 - 34, а 34 - 1.
Кажется возможным, что мы могли бы выбрать строки из этой таблицы, каждая с подзапросом, который проверяет всех предков, чтобы увидеть, установлен ли определенный атрибут. Например. В моем приложении вы можете скрыть элемент и его дочерние элементы, просто установив для столбца видимости родительского элемента значение 0.
Я хочу иметь возможность найти все предметы, где ни один из их предков не спрятан. Я попытался преобразовать косые черты в запятую с помощью команды REPLACE, но для IN требовался набор целых чисел, разделенных запятыми, а не одна строка с строковыми номерами, разделенными запятыми.
Забавно, потому что я могу выполнить этот запрос в два этапа, например, получить строку, затем взять ее столбец предков, разделить идентификаторы и сделать еще один запрос, который проверяет, что идентификатор является IN, этот набор идентификаторов, и что видимость не всегда 0 и whala! Но объединить их в один запрос кажется довольно сложной задачей. Большой поиск показал несколько ответов, но ни один из них на самом деле не делает то, что я хочу.
SELECT * FROM t1 WHERE id = 99;
В столбце предков
99 указано «1/34/87»
SELECT * FROM t1 WHERE visibility = 0 AND id IN (1,34,87);
вид назад, но если это не возвращает строк, то элемент виден.
Кто-нибудь сталкивался с этим раньше и придумал решение. Я действительно не хочу идти по пути хранимых процедур. Это для приложения рельсов.