Выбор SQL многими связанными внешними ключами - PullRequest
0 голосов
/ 25 января 2019

В начале я хотел бы упомянуть, что я пытался найти похожие проблемы, но я не нашел решения.Я делаю все возможное, чтобы выбрать болезнь из моей базы данных, введя несколько ключей идентификатора из таблицы симптомов.Соотношение между таблицами Disease и Sympthoms много-ко-многим с соединяющейся таблицей многоквартирных_поселений, в которой хранятся FK-поля (ветвя_отображения и симптомов_ *)

Поскольку я запрашиваю только один идентификатор, все работает нормально:

SELECT * FROM disease JOIN disease_symptoms ON 
   disease.id=disease_symptoms.disease_id where 
   disease_symptoms.symptoms_id=14 ORDER BY 
   `disease`.`probability` DESC 

Но так как я пытаюсь попросить больше идентификаторов, это не так:

SELECT * FROM disease JOIN disease_symptoms ON 
    disease.id=disease_symptoms.disease_id where 
    disease_symptoms.symptoms_id=14 AND 
    disease_symptoms.symptoms_id=15 ORDER BY 
    `disease`.`probability` DESC 

(я пытаюсь выбрать грипп (id = 1) от болезни, это связано с повышенными симптомамитемпература (ID 14) и кашель (ID 15)) Позже я хотел бы сделать список флажков с симптомами, которые будут возвращать соответствующие заболевания.(php / symfony).

Где я ошибаюсь?

Заранее спасибо:)

Ответы [ 3 ]

0 голосов
/ 25 января 2019
SELECT * FROM disease_symptoms
JOIN disease ON disease_symptoms.disease_id = disease.id
WHERE  disease_symptoms.symptoms_id IN (14, 15)
ORDER BY `disease`.`probability` DESC 

Вам просто нужно выбрать отношение в противоположном направлении.Это вернет все болезни, которые имеют указанные симптомы.

0 голосов
/ 25 января 2019

Вы хотите заболевание (я), которое имеет оба симптома 14 и 15, верно? Таким образом, ваша болезнь должна быть в списке всех болезней, у которых в качестве симптома есть 14, и в списке болезней, у которых в качестве симптома есть 15.

Это может быть:

SELECT * 
FROM disease 
WHERE ID in (select disease_id from disease_symptoms where symptoms_id=14)
and ID in (select disease_id from disease_symptoms where symptoms_id=15)
order by probability DESC 

Пример в SQL Fiddle

0 голосов
/ 25 января 2019

Ваше условие WHERE никогда не вернет никаких данных.

disease_symptoms.symptoms_id=14 AND disease_symptoms.symptoms_id=15 

симптомов_ не может быть 14 И 15 одновременно.

Попробуйте вместо этого следующее.

disease_symptoms.symptoms_id IN (14, 15)

Хорошо, из вашего комментария я лучше представляю, что вы ищете.Попробуйте,

SELECT * FROM disease d
  JOIN disease_symptoms ds1 ON d.id = ds1.disease_id
  JOIN disease_symptoms ds2 ON d.id = ds2.disease_id
 WHERE ds1.symptoms_id = 14
   AND ds2.symptoms_id = 15

Используя псевдонимы, вы можете присоединить таблицу болезней к таблице disasse_symptoms дважды, по одному разу для каждого интересующего вас симптома.

...