Mysql
 sql >> Database >  >> RDS >> Mysql

Converti SQL WHERE IN in JOIN

Penso di aver capito cosa stai cercando di fare. C'è più di un modo per scuoiare un gatto, ma posso suggerire di dividere la tua query in due query separate e quindi di sostituire la complicata clausola WHERE con un paio di inner join? Quindi, qualcosa del genere:

/* 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

Quindi, crea una query separata per ottenere connessioni basate sull'istruzione:

/* 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

Se vuoi davvero che i risultati dei dati vengano combinati, puoi utilizzare UNION poiché entrambe le query restituiscono le stesse colonne dalla tabella person.