Как взять сразу несколько полей одним запросом из другой таблицы?
Давайте рассмотрим такой код:
=: if(condition: $select_1; condition: $select_2; condition: $select_3; then: 10; else: "")
select_1: select(table: 'table'; field: 'field_1'; where: 'id' = #num)
select_2: select(table: 'table'; field: 'field_2'; where: 'id' = #num)
select_3: select(table: 'table'; field: 'field_3'; where: 'id' = #num)
В этом коде у нас есть 3 обращения к одной и той же строке таблицы table
, но к разным полям. Гораздо эффективнее будет взять сразу три поля одним обращением, запомнить их и использовать повторно. Итак делаем:
=: if(condition: $select[field_1]; condition: $select[field_2]; condition: $select[field_3]; then: 10; else: "")
~select: selectRow(table: 'table'; field: 'field_1'; field: 'field_2'; field: 'field_3'; where: 'id' = #num)
При помощи selectRow
мы берем сразу несколько полей из строки.
~
используем, что бы результат был запомнен при первом выполнении и последующие два condition
повторно не ходили в table
.
Результатом selectRow
является row
у которого есть 3 значения — field_1
, field_2
и field_3
. Что бы взять их значения в condition
мы используем []
.
Можно ли в selectRow передать список полей кодом?
Да, есть параметр fields
, куда мы можем передать автоматически сформированный список полей.
Например если мы хотим взять значения всех колонок, то мы можем их получить из таблицы Состав таблиц
:
=: selectRow(table: 'table'; fields: $sel; where: 'id' = #num)
sel: selectList(table: 'tables_fields'; field: 'name'; where: 'table_name' = "table"; where: 'category' = "column")
Как обратиться к элементу строки, которую мы получили кодом?
Через []
— $select[key]
.
В квадратных скобках могут быть использованы все стандартные обращения тотум:
e1: $select[$value]
value: "field_1"
e2: $select[#value]
// Значение поля value — field_2
e3: $select[$#nf]
e4: $select[$$row]
row: "key"
key: "field_3"
~select: selectRow(table: 'table'; field: 'field_1'; field: 'field_2'; field: 'field_3'; where: 'id' = #num)
Какова разница по нагрузке между несколькими select и selectRow
Происходит разное количество обращений к базе данных. Таким образом однократное обращение selectRow
выигрывает по скорости.
Будет ли выигрыш по скорости работы если забыть поставить ~ ?
Нет. Если не зафиксировать значение при первом обращении количество обращений к базе данных будет таким же как и при использовании нескольких select
.