No related entries

310 views
Skip to first unread message

Simon Hall

unread,
Jun 21, 2025, 10:29:45 AM6/21/25
to mementodatabase
I'm trying to identify records that have no entries shown from the related field.
Every record in my library 'Pub Visits' should have at least one related entry from library 'Drinks Consumed'
I've noticed that some do not but, beyond looking through each of nearly 33000 entries, I cannot think of a way of finding these records.
Any help gratefully received

Elizabeth Dixon

unread,
Jun 21, 2025, 10:37:52 AM6/21/25
to Simon Hall, mementodatabase
Hi Simon, you could use a filter.  For example Drinks Consumed is less than 0.

Beth

--
You received this message because you are subscribed to the Google Groups "mementodatabase" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mementodataba...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/mementodatabase/9c6b4fd7-2ac9-4b37-b449-69bc56e60ce1n%40googlegroups.com.

Simon Hall

unread,
Jun 22, 2025, 4:11:37 AM6/22/25
to mementodatabase
Hi Beth

Yes, that would be ideal. Unfortunately, being a related field, it doesn't present as an option in the list of fields in the Pub Visits filters

Though I'm probably missing something obvious!

Mmm

unread,
Jun 22, 2025, 6:04:27 AM6/22/25
to mementodatabase
Создайте запрос SQL:
SELECT * FROM "Pub Visits" WHERE "field name" IS NULL AND removed = 0

Результат запроса сохраните в виде пресета. 

Вариант Beth рабочий. 
Если не получилось - добавьте поле JS, которое будет считать количество записей в поле "Записи библиотеки". Создайте фильтр по полю JS по числу меньше 1.

воскресенье, 22 июня 2025 г. в 11:11:37 UTC+3, Simon Hall:

Simon Hall

unread,
Jun 25, 2025, 1:20:44 AM6/25/25
to mementodatabase
Thanks, though I'm clearly being stupid again.

I have "SELECT * FROM "Pub Visits" WHERE “Drinks Consumed” IS NULL AND removed = 0"
where Drinks Consumed is the related field/table.

This produces an error "Lexical error at line 1, column 34.  Encountered: '\u201c' (8220),"

Mmm

unread,
Jun 25, 2025, 6:40:15 AM6/25/25
to mementodatabase
Я создал тестовые библиотеки. 
Оказалось, что SQL-поиск в библиотеке "Pub Visits" не видит поле "Drinks Consumed". 
Всегда считал, что SQL видит все поля библиотеки, в том числе скрытые. 
К сожалению, проверить на более ранних версиях Memento не могу. 

Вариант с пресетами без дополнительного поля JS не работает. 

Попробуйте так:
1. Создать поле JS "js_drinks" с кодом:

field("Drinks Consumed").length;

2. Создать запрос SQL:

SELECT * FROM "Pub Visits" WHERE "js_drinks" = 0 AND removed = 0

3. Сохранить запрос в виде пресета "No drinks".
4. Для фильтрации записей выбрать пресет "No drinks" и нужный вид отображение (список, таблица, ...).

Шаблон с примером:

К сожалению, мой Тарифный план и шаблоны не имеют возможности поделиться пресетами. 
Настройте пресет самостоятельно. 

Кроме варианта с фильтром (Beth) и варианта с пресетом можете воспользоваться простой группировкой по полю "Drinks Consumed".
Записи без напитков будут собраны в одну группу.

среда, 25 июня 2025 г. в 08:20:44 UTC+3, Simon Hall:
IC_25062025.jpg
Message has been deleted

Simon Hall

unread,
Jun 26, 2025, 5:03:34 PM6/26/25
to mementodatabase
Thanks again for your efforts on this Mmm but I'm still not making any progress.
Perhaps I'm not making myself clear on the nature of "Drinks Consumed" in "Pub Visits"
"Drinks Consumed" is a separate library which shows the related entries when I am in "Pub Visits"
I have attached a PDF showing a record in "Pub Visits" with the related entries from "Drinks Consumed" correctly displayed.
I'm trying to find any records in "Pub Visits" where there are no entries at the bottom of the record under "Drinks Consumed"
Hope this helps in some way

32838.pdf

Mmm

unread,
Jun 26, 2025, 5:54:24 PM6/26/25
to mementodatabase
Теперь стало понятно, что "Drinks Consumed" это не поле, а записи связанной библиотеки. 

Измените код в поле JS "js_drinks" на:

entry().linksFrom('Drinks Consumed', 'Pub Visits').length;

Не забудьте предоставить скриптам доступ к библиотеке "Drinks Consumed". 
Запрос SQL изменять не нужно. 
Пресет будет работать. 

Если захотите фильтр - задайте по полю JS по числу равно 0.

пятница, 27 июня 2025 г. в 00:03:34 UTC+3, Simon Hall:

Mmm

unread,
Jul 2, 2025, 12:08:07 PM7/2/25
to mementodatabase
Я обратился в поддержку по вопросу создания SQL запросов для полей "Запись библиотеки" и получил ответ от Vasily:

"Если поле имеет тип связи «многие ко многим», то в SQL такая связь реализуется через дополнительную таблицу. Подробнее о работе с такими полями вы можете прочитать в разделе справки Linked Records:
https://help.mementodatabase.com/?ht_kb=sql-explorer"

После ознакомления со статьей, предлагаю варианты прямого и обратного решения для создания пресетов без использования дополнительных полей.

Примеры SQL запросов для библиотек:

1. Запросы в библиотеке "Pub Visits".

Задачи.
Найти записи в библиотеке "Pub Visits", в которых записи связанной библиотеки "Drinks Consumed":

– отсутствуют (пресет "Drinks not listed"):

SELECT *
FROM "Pub Visits" pv
WHERE pv.id NOT IN 
(SELECT DISTINCT p.id 
FROM "Pub Visits" p 
JOIN "relations_Drinks Consumed_Pub Visits" r ON p.id = r.dest_id
JOIN "Drinks Consumed" d ON r.source_id = d.id
WHERE p.removed = 0 AND d.removed = 0
AND pv.removed =0
ORDER BY "name"

– существуют (пресет "Drinks are listed"):

SELECT *
FROM "Pub Visits" pv
WHERE pv.id IN 
(SELECT DISTINCT p.id 
FROM "Pub Visits" p 
JOIN "relations_Drinks Consumed_Pub Visits" r ON p.id = r.dest_id
JOIN "Drinks Consumed" d ON r.source_id = d.id
WHERE p.removed = 0 AND d.removed = 0
AND pv.removed =0
ORDER BY "name"

2. Запросы в библиотеке "Drinks Consumed".

Задачи.
Найти записи в библиотеке "Drinks Consumed", в которых поле "Запись библиотеки" "Pub Visits" (связь):

– не имеет ссылок (пресет "Pubs not listed"):

SELECT * 
FROM "Drinks Consumed" dc
WHERE dc.id NOT IN 
(SELECT d.id
FROM "Drinks Consumed" d
JOIN "relations_Drinks Consumed_Pub Visits" r ON d.id = r.source_id 
JOIN "Pub Visits" p ON r.dest_id = p.id
WHERE d.removed = 0 AND p.removed = 0
AND dc.removed = 0
ORDER BY "name"

– имеет ссылки (пресет "Pubs are listed"):

SELECT * 
FROM "Drinks Consumed" dc
WHERE dc.id IN 
(SELECT d.id
FROM "Drinks Consumed" d
JOIN "relations_Drinks Consumed_Pub Visits" r ON d.id = r.source_id 
JOIN "Pub Visits" p ON r.dest_id = p.id
WHERE d.removed = 0 AND p.removed = 0
AND dc.removed = 0
ORDER BY "name"

3. Запросы SQL необходимо сохранить как пресеты в соответствующих библиотеках.

4. Выбирать пресеты для отображения записей в нужном виде.

5. Поле JS "list_dc" в библиотеке "Pub Visits" добавлено только для визуализации теста, при создании пресета не задействовано.

6. Запросы SQL и пресеты в тестовых библиотеках необходимо создать самостоятельно (ими можно делиться только на тарифах Команда).

Шаблоны тестовых библиотек (вариант 2):
https://mementodb.com/t/4808642742452224

пятница, 27 июня 2025 г. в 00:54:24 UTC+3, Mmm:
IC_02072025_2.jpg
IC_02072025_1.jpg

Mmm

unread,
Jul 3, 2025, 10:03:27 AM7/3/25
to mementodatabase
Для Simon.
Итоговый, оптимизированный вариант решения - пресет "No drinks" на основе SQL запроса в библиотеке "Pub Visits":

SELECT DISTINCT pv.id, pv."Visit", pv."Pub Name"

FROM "Pub Visits" pv
WHERE pv.id NOT IN
(SELECT DISTINCT p.id 
FROM "Pub Visits" p 
JOIN "relations_Drinks Consumed_Pub Visits" r ON p.id = r.dest_id
JOIN "Drinks Consumed" d ON r.source_id = d.id
WHERE p.removed = 0 AND d.removed = 0
AND pv.removed =0
ORDER BY "Visit"

Дополнительные поля не нужны.

среда, 2 июля 2025 г. в 19:08:07 UTC+3, Mmm:
Reply all
Reply to author
Forward
0 new messages