Наконец я придумал удобную функцию полезности с унифицированным интерфейсом для итерации объектов, строк, массивов, типизированных массивов, карт, наборов (любые итерации).
const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };
iterate(obj, (value, key) => console.log(key, value));
// a 1
// b 2
// c 3
В вашем запросе теоретически возможно, что у одного ребенка есть два разных родителя, что сделало бы его для нестандартной терминологии. Предположим, что ваши шаблоны данных делают это невозможным.
Затем следующее дает вам тот же результат, используя отдельные индексы, по одному индексу на столбец.
SELECT parent.field, child.field
FROM parent
JOIN child ON child.id = parent.id
UNION ALL
SELECT parent.field, child.field
FROM parent
JOIN child ON child.id = parent.otherid
EXPLAIN
SELECT parent.fld, child.fld
FROM parent JOIN child ON child.id = parent.id
UNION ALL
SELECT parent.fld, child.fld
FROM parent JOIN child ON child.id = parent.otherid
AND parent.otherid <> parent.id
с таблицами с использованием механизма MyISAM:
id select_type TABLE TYPE possible_keys KEY key_len ref ROWS Extra
1 PRIMARY parent ALL PRIMARY 9999
1 PRIMARY child eq_ref PRIMARY PRIMARY 4 test.parent.id 1
2 UNION parent ALL parent_ix1 9999 USING WHERE
2 UNION child eq_ref PRIMARY PRIMARY 4 test.parent.otherid 1
UNION RESULT <union1,2> ALL
с таблицами с использованием механизма InnoDB:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY child ALL PRIMARY 9903
1 PRIMARY parent eq_ref PRIMARY PRIMARY 4 test.child.id 1
2 UNION child ALL PRIMARY 9903
2 UNION parent ref parent_ix1 parent_ix1 5 test.child.id 1 Using where
UNION RESULT <union1,2> ALL