php - Doing multiple joins in a query MySQL -


i new mysql , having trouble figuring out.

i have 2 tables called doctors , doctor_tags

fields doctors: doctor_id, doctor_name

fields doctor_tags: id, doctor_id, tag_name

now specific doctor_id need find related doctors. doctors related if have same tag_name. once find relation need doctor_name of these doctors back.

i lost i've got far (i sure it's wrong)

select doctors.doctor_name, doctors.doctor_id doctors inner join doctors_tags on doctors.doctor_id = doctors_tags.doctor_id ...

i konw query pretty useless know need type of join.

for whoever kind enough comeup sort of query, very thankful if explain each part of in process. :)

edit: part 2

if lets introduce table has n:n relationship between doctor_id , tag_id

table fields doctor_tags_joins: doctor_id,tag_id

and fields tag table change

doctors_tags: tag_id, tag_name , on...

how can same thing additional table included mix.

you need join tables twice:

select distinct d1.doctor_id, d2.doctor_name doctors d1 -- first doctor's tags join doctor_tags dt1 on d1.doctor_id = dt1.doctor_id -- other doctor_tags rows same tags join doctor_tags dt2 on dt1.tag_name = dt2.tag_name      -- don't list doctors related     , dt1.doctor_id != dt2.doctor_id -- doctors' names join doctors d2 on dt2.doctor_id = d2.doctor_id order d1.doctor_id, d2.doctor_name 

i use distinct don't multiple rows same doctors if have multiple tags in common.

if you're looking doctors related specific doctor, rather doctors, query becomes:

select doctor_name doctor_tags dt1 join doctor_tags dt2 on dt1.tag_name = dt2.tag_name , dt1.doctor_id != dt2.doctor_id join doctors d2 on dt2.doctor_id = d2.doctor_id dt1.doctor_id = :doctor_id 

where :doctor_id placeholder given doctor. don't need first doctor table because you're not using information table.

if want related doctor names on 1 line, use group_concat:

select d1.doctor_id, group_concat(distinct d2.doctor_name) related_doctors doctors d1 join doctor_tags dt1 on d1.doctor_id = dt1.doctor_id join doctor_tags dt2 on dt1.tag_name = dt2.tag_name , dt1.doctor_id != dt2.doctor_id join doctors d2 on dt2.doctor_id = d2.doctor_id group d1.doctor_id 

for second question, queries same, except use doctor_tags_join instead of doctor_tags. since you're not showing tag names in results, doctor_tags table irrelevant.

select distinct d1.doctor_id, d2.doctor_name doctors d1 join doctor_tags_join dt1 on d1.doctor_id = dt1.doctor_id join doctor_tags_join dt2 on dt1.tag_id = dt2.tag_id      , dt1.doctor_id != dt2.doctor_id join doctors d2 on dt2.doctor_id = d2.doctor_id order d1.doctor_id, d2.doctor_name 

Comments

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -