Saya pikir saya mengerti apa yang Anda coba lakukan. Ada lebih dari satu cara untuk menguliti kucing, tetapi bolehkah saya menyarankan untuk membagi kueri Anda menjadi dua kueri terpisah, dan kemudian mengganti klausa WHERE yang rumit dengan beberapa gabungan dalam? Jadi, kira-kira seperti ini:
/* 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
Kemudian, buat kueri terpisah untuk mendapatkan koneksi berdasarkan pendidikan:
/* 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
Jika Anda benar-benar ingin hasil data digabungkan, Anda dapat menggunakan UNION
karena kedua kueri mengembalikan kolom yang sama dari tabel orang.