Одна из ваших проблем заключается в том, что у вас есть отдельная строка для каждого родительского отношения. Если вы хотите объединить это в одну строку (с отдельными столбцами для каждого родителя), вам придется использовать агрегацию.
Как отметил @Venkataraman_R, вы можете присоединить таблицу Child
к таблице Parent
дважды (один раз для отца и один раз для матери). Затем вы можете использовать агрегатную функцию, чтобы «сложить» строки в 1:
SELECT
child_parent.cid,
father_id = MIN(Father.pid),
father_name = MIN(Father.pname),
mother_id = MIN(Mother.pid),
mother_name = MIN(Mother.pname)
FROM child_parent
LEFT JOIN parent AS Father ON
Father.pid = child_parent.pid
AND Father.gender = 'M'
LEFT JOIN parent as Mother ON
Mother.pid = child_parent.pid
AND Mother.gender = 'F'
GROUP BY child_parent.cid
Обратите внимание, как я каждый раз даю значимым псевдонимам для родительской таблицы, как @ Venkataraman_R.
С агрегатными функциями у вас теперь есть одна строка:
+-----+-----------+-------------+-----------+-------------+
| cid | father_id | father_name | mother_id | mother_name |
+-----+-----------+-------------+-----------+-------------+
| 1 | 2 | Jack | 3 | Josephine |
+-----+-----------+-------------+-----------+-------------+
Теперь, предостережение: этот запрос предполагает, что у каждого ребенка будет максимум один отец и максимум одна мать. Как насчет детей с 2 матерями или 2 отцами (или более, в случае многоженства)? Кроме того, в домохозяйствах с одним родителем вам нужно будет обрабатывать случаи, когда один из столбцов будет нулевым.
Кроме того, в зависимости от того, что вы моделируете, вам может потребоваться рассмотреть случаи, когда пол родителя не является ни «М», ни «F».
У меня есть скрипка здесь . Это Postgres, но синтаксис примерно такой же.