Virajsinh

tbl_family_relationships.sql

Jul 16th, 2025 (edited)
793
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 22.17 KB | Source Code | 0 0
  1. -- Get Surname With Translation
  2.  
  3. SELECT
  4.     s.id AS surname_id,
  5.     s.surname,
  6.     MAX(CASE WHEN l.code = 'gu' THEN st.translation END) AS st_gu,
  7.     MAX(CASE WHEN l.code = 'hi' THEN st.translation END) AS st_hi
  8. FROM
  9.     surname s
  10. LEFT JOIN
  11.     surname_translation st ON s.id = st.surname_id
  12. LEFT JOIN
  13.     languages l ON st.language_code_id = l.id
  14. GROUP BY
  15.     s.id, s.surname;
  16.  
  17. -- A and B are children of C
  18. INSERT INTO family_relationships (child_id, parent_id, relation_type) VALUES
  19. (1, 3, 'father'),
  20. (2, 3, 'father');
  21.  
  22. -- C is a child of D
  23. INSERT INTO family_relationships (child_id, parent_id, relation_type) VALUES
  24. (3, 4, 'father');
  25.  
  26. INSERT INTO `family_relationships` (`id`, `child_id`, `parent_id`, `relation_type`, `created_at`) VALUES
  27. (NULL, '1', '5', 'mother', current_timestamp()),
  28. (NULL, '2', '5', 'mother', current_timestamp());
  29.  
  30. -- Select Query
  31.  
  32. WITH RECURSIVE descendants AS (
  33.   SELECT
  34.     fr.parent_id,
  35.     fr.child_id,
  36.     1 AS level
  37.   FROM family_relationships fr
  38.   WHERE fr.parent_id = 4
  39.  
  40.   UNION ALL
  41.  
  42.   SELECT
  43.     fr.parent_id,
  44.     fr.child_id,
  45.     d.level + 1
  46.   FROM family_relationships fr
  47.   JOIN descendants d ON fr.parent_id = d.child_id
  48. )
  49. SELECT
  50.   d.level,
  51.   r.id,
  52.   CONCAT(r.first_name, ' ', r.middle_name, ' ', r.last_name) AS full_name
  53. FROM descendants d
  54. JOIN tbl_registration r ON r.id = d.child_id
  55. ORDER BY d.level;
  56.  
  57. -- Select Query Father With Mother
  58.  
  59. SELECT
  60.     c.id AS child_id,
  61.     CONCAT(c.first_name, ' ', c.middle_name, ' ', c.last_name) AS child_name,
  62.  
  63.     -- Father
  64.     CONCAT(f.first_name, ' ', f.middle_name, ' ', f.last_name) AS father_name,
  65.  
  66.     -- Mother
  67.     CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name) AS mother_name
  68.  
  69. FROM tbl_registration c
  70.  
  71. -- Father Join
  72. LEFT JOIN family_relationships fr_f ON fr_f.child_id = c.id AND fr_f.relation_type = 'father'
  73. LEFT JOIN tbl_registration f ON fr_f.parent_id = f.id
  74.  
  75. -- Mother Join
  76. LEFT JOIN family_relationships fr_m ON fr_m.child_id = c.id AND fr_m.relation_type = 'mother'
  77. LEFT JOIN tbl_registration m ON fr_m.parent_id = m.id
  78.  
  79. WHERE c.id IN (1,2)
  80.  
  81. ORDER BY c.id;
  82.  
  83. -- 2 Select Query Father With Mother
  84.  
  85. SELECT
  86.     c.id AS person_id,
  87.     CONCAT(c.first_name, ' ', c.middle_name, ' ', c.last_name) AS person_name,
  88.    
  89.     -- Father
  90.     COALESCE(
  91.         CONCAT(f.first_name, ' ', f.middle_name, ' ', f.last_name),
  92.         'Not Found'
  93.     ) AS father_name,
  94.    
  95.     -- Mother
  96.     COALESCE(
  97.         CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name),
  98.         'Not Found'
  99.     ) AS mother_name,
  100.    
  101.     -- Spouse (wife/husband)
  102.     COALESCE(
  103.         CONCAT(s.first_name, ' ', s.middle_name, ' ', s.last_name),
  104.         'Not Found'
  105.     ) AS spouse_name,
  106.    
  107.     -- Maiden name (if available)
  108.     COALESCE(
  109.         (SELECT CONCAT(mn.maiden_first_name, ' ', mn.maiden_middle_name, ' ', mn.maiden_last_name)
  110.          FROM tbl_maiden_name mn
  111.          WHERE mn.registration_id = c.id),
  112.         'Not Found'
  113.     ) AS maiden_name
  114.    
  115. FROM tbl_registration c
  116.  
  117. -- Father Join (relation_type_id = 1 for father)
  118. LEFT JOIN tbl_family_relationships fr_f ON fr_f.person_id = c.id
  119.     AND fr_f.relation_type_id = (SELECT id FROM tbl_relation_types WHERE name = 'father')
  120. LEFT JOIN tbl_registration f ON fr_f.related_person_id = f.id
  121.  
  122. -- Mother Join (relation_type_id = 2 for mother)
  123. LEFT JOIN tbl_family_relationships fr_m ON fr_m.person_id = c.id
  124.     AND fr_m.relation_type_id = (SELECT id FROM tbl_relation_types WHERE name = 'mother')
  125. LEFT JOIN tbl_registration m ON fr_m.related_person_id = m.id
  126.  
  127. -- Spouse Join (relation_type_id = 4 for wife or 5 for husband)
  128. LEFT JOIN tbl_family_relationships fr_s ON fr_s.person_id = c.id
  129.     AND fr_s.relation_type_id IN (
  130.         SELECT id FROM tbl_relation_types
  131.         WHERE name IN ('wife', 'husband')
  132.     )
  133. LEFT JOIN tbl_registration s ON fr_s.related_person_id = s.id
  134.  
  135. WHERE c.id IN (1, 7)
  136. ORDER BY c.id;
  137.  
  138. ------------------------------------
  139.  
  140. WITH RECURSIVE family_tree AS (
  141.     -- Start with the base generation (you can change the starting ID)
  142.     SELECT
  143.         id,
  144.         0 AS generation,
  145.         CAST(id AS CHAR(1000)) AS path
  146.     FROM tbl_registration
  147.     WHERE id IN (1, 2)
  148.    
  149.     UNION ALL
  150.    
  151.     -- Find all ancestors (parents)
  152.     SELECT
  153.         r.id,
  154.         ft.generation - 1,
  155.         CONCAT(ft.path, ',', r.id)
  156.     FROM family_tree ft
  157.     JOIN tbl_family_relationships fr ON fr.person_id = ft.id
  158.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  159.         AND rt.name IN ('father', 'mother')
  160.     JOIN tbl_registration r ON fr.related_person_id = r.id
  161.     WHERE FIND_IN_SET(r.id, ft.path) = 0  -- Prevent cycles
  162.    
  163.     UNION ALL
  164.    
  165.     -- Find all descendants (children)
  166.     SELECT
  167.         r.id,
  168.         ft.generation + 1,
  169.         CONCAT(ft.path, ',', r.id)
  170.     FROM family_tree ft
  171.     JOIN tbl_family_relationships fr ON fr.related_person_id = ft.id
  172.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  173.         AND rt.name = 'child'
  174.     JOIN tbl_registration r ON fr.person_id = r.id
  175.     WHERE FIND_IN_SET(r.id, ft.path) = 0  -- Prevent cycles
  176. )
  177.  
  178. SELECT
  179.     ft.generation,
  180.     r.id,
  181.     CONCAT(r.first_name, ' ', r.middle_name, ' ', r.last_name) AS person_name,
  182.    
  183.     -- Father
  184.     COALESCE((
  185.         SELECT CONCAT(f.first_name, ' ', f.middle_name, ' ', f.last_name)
  186.         FROM tbl_family_relationships fr
  187.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'father'
  188.         JOIN tbl_registration f ON fr.related_person_id = f.id
  189.         WHERE fr.person_id = r.id
  190.     ), 'Not Found') AS father,
  191.    
  192.     -- Mother
  193.     COALESCE((
  194.         SELECT CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name)
  195.         FROM tbl_family_relationships fr
  196.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'mother'
  197.         JOIN tbl_registration m ON fr.related_person_id = m.id
  198.         WHERE fr.person_id = r.id
  199.     ), 'Not Found') AS mother,
  200.    
  201.     -- Spouse
  202.     COALESCE((
  203.         SELECT CONCAT(s.first_name, ' ', s.middle_name, ' ', s.last_name)
  204.         FROM tbl_family_relationships fr
  205.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name IN ('wife', 'husband')
  206.         JOIN tbl_registration s ON fr.related_person_id = s.id
  207.         WHERE fr.person_id = r.id
  208.     ), 'Not Found') AS spouse,
  209.    
  210.     -- Maiden name
  211.     COALESCE((
  212.         SELECT CONCAT(mn.maiden_first_name, ' ', mn.maiden_middle_name, ' ', mn.maiden_last_name)
  213.         FROM tbl_maiden_name mn
  214.         WHERE mn.registration_id = r.id
  215.     ), 'Not Found') AS maiden_name,
  216.    
  217.     -- Children list
  218.     (
  219.         SELECT GROUP_CONCAT(CONCAT(ch.first_name, ' ', ch.middle_name, ' ', ch.last_name) SEPARATOR ', ')
  220.         FROM tbl_family_relationships fr
  221.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'child'
  222.         JOIN tbl_registration ch ON fr.person_id = ch.id
  223.         WHERE fr.related_person_id = r.id
  224.     ) AS children
  225.  
  226. FROM family_tree ft
  227. JOIN tbl_registration r ON ft.id = r.id
  228. GROUP BY r.id  -- Ensure each person appears only once
  229. ORDER BY ft.generation, r.id;
  230.  
  231. ------------------------------------
  232.  
  233. WITH RECURSIVE family_tree AS (
  234.     -- Start with base individuals (Virajsinh and Keyur)
  235.     SELECT
  236.         id,
  237.         0 AS generation,
  238.         CAST(id AS CHAR(1000)) AS path
  239.     FROM tbl_registration
  240.     WHERE id IN (1)  -- Virajsinh and Keyur
  241.    
  242.     UNION ALL
  243.    
  244.     -- Find ancestors (parents)
  245.     SELECT
  246.         r.id,
  247.         ft.generation - 1,
  248.         CONCAT(ft.path, ',', r.id)
  249.     FROM family_tree ft
  250.     JOIN tbl_family_relationships fr ON fr.person_id = ft.id
  251.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  252.         AND rt.name IN ('father', 'mother')
  253.     JOIN tbl_registration r ON fr.related_person_id = r.id
  254.     WHERE FIND_IN_SET(r.id, ft.path) = 0
  255.    
  256.     UNION ALL
  257.    
  258.     -- Find descendants (children)
  259.     SELECT
  260.         r.id,
  261.         ft.generation + 1,
  262.         CONCAT(ft.path, ',', r.id)
  263.     FROM family_tree ft
  264.     JOIN tbl_family_relationships fr ON fr.related_person_id = ft.id
  265.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  266.         AND rt.reverse_relation = 'parent'
  267.     JOIN tbl_registration r ON fr.person_id = r.id
  268.     WHERE FIND_IN_SET(r.id, ft.path) = 0
  269.    
  270.     UNION ALL
  271.    
  272.     -- Find spouses
  273.     SELECT
  274.         r.id,
  275.         ft.generation,  -- Same generation as the person
  276.         CONCAT(ft.path, ',', r.id)
  277.     FROM family_tree ft
  278.     JOIN tbl_family_relationships fr ON fr.person_id = ft.id
  279.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  280.         AND rt.name IN ('wife', 'husband')
  281.     JOIN tbl_registration r ON fr.related_person_id = r.id
  282.     WHERE FIND_IN_SET(r.id, ft.path) = 0
  283. )
  284.  
  285. SELECT
  286.     ft.generation,
  287.     r.id,
  288.     CONCAT(r.first_name, ' ', r.middle_name, ' ', r.last_name) AS person_name,
  289.    
  290.     -- Father
  291.     COALESCE((
  292.         SELECT CONCAT(f.first_name, ' ', f.middle_name, ' ', f.last_name)
  293.         FROM tbl_family_relationships fr
  294.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'father'
  295.         JOIN tbl_registration f ON fr.related_person_id = f.id
  296.         WHERE fr.person_id = r.id
  297.     ), 'Not Found') AS father,
  298.    
  299.     -- Mother
  300.     COALESCE((
  301.         SELECT CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name)
  302.         FROM tbl_family_relationships fr
  303.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'mother'
  304.         JOIN tbl_registration m ON fr.related_person_id = m.id
  305.         WHERE fr.person_id = r.id
  306.     ), 'Not Found') AS mother,
  307.    
  308.     -- Spouse
  309.     COALESCE((
  310.         SELECT CONCAT(s.first_name, ' ', s.middle_name, ' ', s.last_name)
  311.         FROM tbl_family_relationships fr
  312.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name IN ('wife', 'husband')
  313.         JOIN tbl_registration s ON fr.related_person_id = s.id
  314.         WHERE fr.person_id = r.id
  315.     ), 'Not Found') AS spouse,
  316.    
  317.     -- Maiden name
  318.     COALESCE((
  319.         SELECT CONCAT(mn.maiden_first_name, ' ', mn.maiden_middle_name, ' ', mn.maiden_last_name)
  320.         FROM tbl_maiden_name mn
  321.         WHERE mn.registration_id = r.id
  322.     ), 'Not Found') AS maiden_name,
  323.    
  324.     -- Corrected children list
  325.     (
  326.         SELECT GROUP_CONCAT(
  327.             CONCAT(ch.first_name, ' ', ch.middle_name, ' ', ch.last_name)
  328.             ORDER BY ch.id SEPARATOR ', '
  329.         )
  330.         FROM tbl_family_relationships fr
  331.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.reverse_relation = 'parent'
  332.         JOIN tbl_registration ch ON fr.person_id = ch.id
  333.         WHERE fr.related_person_id = r.id
  334.     ) AS children
  335.  
  336. FROM family_tree ft
  337. JOIN tbl_registration r ON ft.id = r.id
  338. GROUP BY r.id
  339. ORDER BY ft.generation, r.id;
  340.  
  341. ------------------------------------
  342.  
  343. WITH RECURSIVE family_tree AS (
  344.     -- Start with Virajsinh (ID 1)
  345.     SELECT
  346.         id,
  347.         0 AS generation,
  348.         CAST(id AS CHAR(1000)) AS path
  349.     FROM tbl_registration
  350.     WHERE id = 1  -- Starting with Virajsinh
  351.    
  352.     UNION ALL
  353.    
  354.     -- Find ancestors (parents)
  355.     SELECT
  356.         r.id,
  357.         ft.generation - 1,
  358.         CONCAT(ft.path, ',', r.id)
  359.     FROM family_tree ft
  360.     JOIN tbl_family_relationships fr ON fr.person_id = ft.id
  361.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  362.         AND rt.name IN ('father', 'mother')
  363.     JOIN tbl_registration r ON fr.related_person_id = r.id
  364.     WHERE FIND_IN_SET(r.id, ft.path) = 0
  365.    
  366.     UNION ALL
  367.    
  368.     -- Find descendants (children)
  369.     SELECT
  370.         r.id,
  371.         ft.generation + 1,
  372.         CONCAT(ft.path, ',', r.id)
  373.     FROM family_tree ft
  374.     JOIN tbl_family_relationships fr ON fr.related_person_id = ft.id
  375.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  376.         AND rt.reverse_relation = 'parent'
  377.     JOIN tbl_registration r ON fr.person_id = r.id
  378.     WHERE FIND_IN_SET(r.id, ft.path) = 0
  379.    
  380.     UNION ALL
  381.    
  382.     -- Find spouses
  383.     SELECT
  384.         r.id,
  385.         ft.generation,
  386.         CONCAT(ft.path, ',', r.id)
  387.     FROM family_tree ft
  388.     JOIN tbl_family_relationships fr ON fr.person_id = ft.id
  389.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  390.         AND rt.name IN ('wife', 'husband')
  391.     JOIN tbl_registration r ON fr.related_person_id = r.id
  392.     WHERE FIND_IN_SET(r.id, ft.path) = 0
  393.    
  394.     UNION ALL
  395.    
  396.     -- Find siblings (both directions)
  397.     SELECT
  398.         CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END AS id,
  399.         ft.generation,
  400.         CONCAT(ft.path, ',', CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END)
  401.     FROM family_tree ft
  402.     JOIN tbl_family_relationships fr ON
  403.         (fr.person_id = ft.id OR fr.related_person_id = ft.id)
  404.     JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id
  405.         AND rt.name IN ('brother', 'sister')
  406.     WHERE CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END != ft.id
  407.     AND FIND_IN_SET(CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END, ft.path) = 0
  408. )
  409.  
  410. SELECT
  411.     ft.generation,
  412.     r.id,
  413.     CONCAT(r.first_name, ' ', r.middle_name, ' ', r.last_name) AS person_name,
  414.    
  415.     -- Father
  416.     COALESCE((
  417.         SELECT CONCAT(f.first_name, ' ', f.middle_name, ' ', f.last_name)
  418.         FROM tbl_family_relationships fr
  419.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'father'
  420.         JOIN tbl_registration f ON fr.related_person_id = f.id
  421.         WHERE fr.person_id = r.id
  422.     ), 'Not Found') AS father,
  423.    
  424.     -- Mother
  425.     COALESCE((
  426.         SELECT CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name)
  427.         FROM tbl_family_relationships fr
  428.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name = 'mother'
  429.         JOIN tbl_registration m ON fr.related_person_id = m.id
  430.         WHERE fr.person_id = r.id
  431.     ), 'Not Found') AS mother,
  432.    
  433.     -- Spouse
  434.     COALESCE((
  435.         SELECT CONCAT(s.first_name, ' ', s.middle_name, ' ', s.last_name)
  436.         FROM tbl_family_relationships fr
  437.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name IN ('wife', 'husband')
  438.         JOIN tbl_registration s ON fr.related_person_id = s.id
  439.         WHERE fr.person_id = r.id
  440.     ), 'Not Found') AS spouse,
  441.    
  442.     -- Maiden name
  443.     COALESCE((
  444.         SELECT CONCAT(mn.maiden_first_name, ' ', mn.maiden_middle_name, ' ', mn.maiden_last_name)
  445.         FROM tbl_maiden_name mn
  446.         WHERE mn.registration_id = r.id
  447.     ), 'Not Found') AS maiden_name,
  448.    
  449.     -- Corrected children list (only shows actual children)
  450.     (
  451.         SELECT GROUP_CONCAT(DISTINCT
  452.             CONCAT(ch.first_name, ' ', ch.middle_name, ' ', ch.last_name)
  453.             ORDER BY ch.id SEPARATOR ', '
  454.         )
  455.         FROM tbl_family_relationships fr
  456.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.reverse_relation = 'parent'
  457.         JOIN tbl_registration ch ON fr.person_id = ch.id
  458.         WHERE fr.related_person_id = r.id
  459.     ) AS children,
  460.    
  461.     -- Corrected siblings list (no duplicates)
  462.     (
  463.         SELECT GROUP_CONCAT(DISTINCT
  464.             CONCAT(sib.first_name, ' ', sib.middle_name, ' ', sib.last_name)
  465.             ORDER BY sib.id SEPARATOR ', '
  466.         )
  467.         FROM tbl_family_relationships fr
  468.         JOIN tbl_relation_types rt ON fr.relation_type_id = rt.id AND rt.name IN ('brother', 'sister')
  469.         JOIN tbl_registration sib ON
  470.             (fr.person_id = r.id AND fr.related_person_id = sib.id) OR
  471.             (fr.related_person_id = r.id AND fr.person_id = sib.id)
  472.         WHERE sib.id != r.id
  473.     ) AS siblings
  474.  
  475. FROM family_tree ft
  476. JOIN tbl_registration r ON ft.id = r.id
  477. GROUP BY r.id
  478. ORDER BY ft.generation, r.id;
  479.  
  480. -- ----------------------------------
  481. WITH RECURSIVE family_tree AS (
  482.   -- Start with Virajsinh (ID 1)
  483.   SELECT
  484.     id,
  485.     0 AS generation,
  486.     CAST(id AS CHAR(1000)) AS path
  487.   FROM registration
  488.   WHERE id = 1
  489.  
  490.   UNION ALL
  491.  
  492.   -- Ancestors (parents)
  493.   SELECT
  494.     r.id,
  495.     ft.generation - 1,
  496.     CONCAT(ft.path, ',', r.id)
  497.   FROM family_tree ft
  498.   JOIN family_relationships fr
  499.     ON fr.person_id = ft.id
  500.   JOIN relation_types rt
  501.     ON fr.relation_type_id = rt.id
  502.      AND rt.name IN ('father', 'mother')
  503.   JOIN registration r
  504.     ON fr.related_person_id = r.id
  505.   WHERE FIND_IN_SET(r.id, ft.path) = 0
  506.  
  507.   UNION ALL
  508.  
  509.   -- Descendants (children)
  510.   SELECT
  511.     r.id,
  512.     ft.generation + 1,
  513.     CONCAT(ft.path, ',', r.id)
  514.   FROM family_tree ft
  515.   JOIN family_relationships fr
  516.     ON fr.related_person_id = ft.id
  517.   JOIN relation_types rt
  518.     ON fr.relation_type_id = rt.id
  519.      AND rt.name IN ('father', 'mother')
  520.   JOIN registration r
  521.     ON fr.person_id = r.id
  522.   WHERE FIND_IN_SET(r.id, ft.path) = 0
  523.  
  524.   UNION ALL
  525.  
  526.   -- Spouses
  527.   SELECT
  528.     r.id,
  529.     ft.generation,
  530.     CONCAT(ft.path, ',', r.id)
  531.   FROM family_tree ft
  532.   JOIN family_relationships fr
  533.     ON fr.person_id = ft.id
  534.   JOIN relation_types rt
  535.     ON fr.relation_type_id = rt.id
  536.      AND rt.name IN ('wife', 'husband')
  537.   JOIN registration r
  538.     ON fr.related_person_id = r.id
  539.   WHERE FIND_IN_SET(r.id, ft.path) = 0
  540.  
  541.   UNION ALL
  542.  
  543.   -- Siblings (both directions)
  544.   SELECT
  545.     CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END AS id,
  546.     ft.generation,
  547.     CONCAT(ft.path, ',', CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END)
  548.   FROM family_tree ft
  549.   JOIN family_relationships fr
  550.     ON fr.person_id = ft.id OR fr.related_person_id = ft.id
  551.   JOIN relation_types rt
  552.     ON fr.relation_type_id = rt.id
  553.      AND rt.name IN ('brother', 'sister')
  554.   WHERE CASE
  555.           WHEN fr.person_id = ft.id THEN fr.related_person_id
  556.           ELSE fr.person_id
  557.         END <> ft.id
  558.     AND FIND_IN_SET(
  559.           CASE WHEN fr.person_id = ft.id THEN fr.related_person_id ELSE fr.person_id END,
  560.           ft.path
  561.         ) = 0
  562. )
  563.  
  564. SELECT
  565.   MIN(ft.generation) AS generation,
  566.   r.id,
  567.   CONCAT(r.first_name, ' ', r.middle_name, ' ', r.last_name) AS person_name,
  568.  
  569.   -- Father
  570.   COALESCE(fa.name, 'Not Found') AS father,
  571.  
  572.   -- Mother
  573.   COALESCE(mo.name, 'Not Found') AS mother,
  574.  
  575.   -- Spouse
  576.   COALESCE(spouse.name, 'Not Found') AS spouse,
  577.  
  578.   -- Maiden Name
  579.   COALESCE(mn.name, 'Not Found') AS maiden_name,
  580.  
  581.   -- Children (aggregated, both directions)
  582.   COALESCE(children.names, 'Not Found') AS children,
  583.  
  584.   -- Siblings (aggregated)
  585.   COALESCE(sibs.names, 'Not Found') AS siblings
  586.  
  587. FROM family_tree ft
  588. JOIN registration r
  589.   ON ft.id = r.id
  590.  
  591. -- Father lookup
  592. LEFT JOIN (
  593.   SELECT fr.person_id,
  594.          CONCAT(f.first_name, ' ', f.middle_name, ' ', f.last_name) AS name
  595.   FROM family_relationships fr
  596.   JOIN relation_types rt
  597.     ON fr.relation_type_id = rt.id
  598.      AND rt.name = 'father'
  599.   JOIN registration f
  600.     ON fr.related_person_id = f.id
  601. ) AS fa ON fa.person_id = r.id
  602.  
  603. -- Mother lookup
  604. LEFT JOIN (
  605.   SELECT fr.person_id,
  606.          CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name) AS name
  607.   FROM family_relationships fr
  608.   JOIN relation_types rt
  609.     ON fr.relation_type_id = rt.id
  610.      AND rt.name = 'mother'
  611.   JOIN registration m
  612.     ON fr.related_person_id = m.id
  613. ) AS mo ON mo.person_id = r.id
  614.  
  615. -- Spouse lookup
  616. LEFT JOIN (
  617.   SELECT fr.person_id,
  618.          CONCAT(s.first_name, ' ', s.middle_name, ' ', s.last_name) AS name
  619.   FROM family_relationships fr
  620.   JOIN relation_types rt
  621.     ON fr.relation_type_id = rt.id
  622.      AND rt.name IN ('wife', 'husband')
  623.   JOIN registration s
  624.     ON fr.related_person_id = s.id
  625. ) AS spouse ON spouse.person_id = r.id
  626.  
  627. -- Maiden name lookup
  628. LEFT JOIN (
  629.   SELECT mn.registration_id,
  630.          CONCAT(mn.first_name, ' ', mn.middle_name, ' ', mn.last_name) AS name
  631.   FROM maiden_name mn
  632. ) AS mn ON mn.registration_id = r.id
  633.  
  634. -- Children lookup (both directions: father/mother → child and son/daughter → parent)
  635. LEFT JOIN (
  636.   SELECT parent_id,
  637.          GROUP_CONCAT(DISTINCT
  638.            TRIM(
  639.              CONCAT(
  640.                CASE
  641.                  WHEN c.gender = 2 AND mn.id IS NOT NULL THEN
  642.                    CONCAT(mn.first_name, ' ', mn.middle_name, ' ', mn.last_name)
  643.                  ELSE
  644.                    CONCAT(c.first_name, ' ', c.middle_name, ' ', c.last_name)
  645.                END
  646.              )
  647.            )
  648.            ORDER BY c.id SEPARATOR ', '
  649.          ) AS names
  650.   FROM (
  651.     SELECT fr.related_person_id AS parent_id, fr.person_id AS child_id
  652.     FROM family_relationships fr
  653.     JOIN relation_types rt
  654.       ON fr.relation_type_id = rt.id
  655.        AND rt.name IN ('father', 'mother')
  656.  
  657.     UNION ALL
  658.  
  659.     SELECT fr.person_id AS parent_id, fr.related_person_id AS child_id
  660.     FROM family_relationships fr
  661.     JOIN relation_types rt
  662.       ON fr.relation_type_id = rt.id
  663.        AND rt.name IN ('son', 'daughter')
  664.   ) AS unioned
  665.   JOIN registration c ON unioned.child_id = c.id
  666.   LEFT JOIN maiden_name mn ON mn.registration_id = c.id
  667.   GROUP BY parent_id
  668. ) AS children ON children.parent_id = r.id
  669.  
  670. -- Siblings lookup (aggregated with maiden name for females)
  671. LEFT JOIN (
  672.   SELECT s.person_id,
  673.          GROUP_CONCAT(DISTINCT
  674.            TRIM(
  675.              CONCAT(
  676.                CASE
  677.                  WHEN sib.gender = 2 AND mn.id IS NOT NULL THEN
  678.                    CONCAT(mn.first_name, ' ', mn.middle_name, ' ', mn.last_name)
  679.                  ELSE
  680.                    CONCAT(sib.first_name, ' ', sib.middle_name, ' ', sib.last_name)
  681.                END
  682.              )
  683.            )
  684.            ORDER BY sib.id SEPARATOR ', '
  685.          ) AS names
  686.   FROM (
  687.     SELECT fr.related_person_id AS sib_id, fr.person_id AS person_id
  688.     FROM family_relationships fr
  689.     JOIN relation_types rt ON fr.relation_type_id = rt.id
  690.     WHERE rt.name IN ('brother', 'sister')
  691.  
  692.     UNION ALL
  693.  
  694.     SELECT fr.person_id AS sib_id, fr.related_person_id AS person_id
  695.     FROM family_relationships fr
  696.     JOIN relation_types rt ON fr.relation_type_id = rt.id
  697.     WHERE rt.name IN ('brother', 'sister')
  698.   ) AS s
  699.   JOIN registration sib ON sib.id = s.sib_id
  700.   LEFT JOIN maiden_name mn ON mn.registration_id = sib.id
  701.   GROUP BY s.person_id
  702. ) AS sibs ON sibs.person_id = r.id
  703.  
  704. GROUP BY r.id
  705. ORDER BY generation, r.id;
Tags: mysql Database
Advertisement
Add Comment
Please, Sign In to add comment