Ich glaube, ich verstehe, was du vorhast. Es gibt mehr als eine Möglichkeit, eine Katze zu häuten, aber darf ich vorschlagen, Ihre Abfrage in zwei separate Abfragen aufzuteilen und dann die komplizierte WHERE-Klausel durch ein paar innere Verknüpfungen zu ersetzen? Also etwa so:
/* Find connections based on health care */
SELECT p2.p_id as id, p2.fname, p2.lname, p2.image
FROM person p
JOIN health_case hc on hc.patient = p.p_id
JOIN health_case hc2 on hc2.doctor = hc.doctor and hc2.healthcenter = hc.healthcenter and hc.start <= hc2.end and hc.end >= hc2.start and hc2.patient <> hc.patient
JOIN person p2 on p2.p_id = hc2.patient and p2.p_id <> p.p_id
WHERE p.p_id = :id
Erstellen Sie dann eine separate Abfrage, um Verbindungen basierend auf Bildung zu erhalten:
/* Find connections based on education */
SELECT p2.p_id as id, p2.fname, p2.lname, p2.image
FROM person p
JOIN education e on e.pupil = p.p_id
JOIN education e2 on e2.school = e.school and e2.start <= e.end AND e2.end >= e.start and e.pupil <> e2.pupil
JOIN person p2 on p2.p_id = e2.pupil and p2.p_id <> p.p_id
WHERE p.p_id = :id
Wenn Sie wirklich möchten, dass die Datenergebnisse kombiniert werden, können Sie UNION
verwenden da beide Abfragen dieselben Spalten aus der Personentabelle zurückgeben.