2016-05-13 3 views
0

У меня возникли проблемы с попыткой выяснить, как выбрать несколько записей с несколькими значениями. Позвольте мне попытаться сломать его.Выберите несколько разных значений из таблицы и оцените их для соответствия в таблице

У меня есть две таблицы.

Таблица 1: Болезни

enter image description here

Таблица 2: Симптомы

enter image description here

То, что я хочу сделать, это когда пользователь вводит симптом, он будет проходить через стол заболеваний и найдите соответствующий симптом, связанный с ним, и затем он вернет заболевание, которое имеет данный признак.

Это запрос SQL у меня есть до сих пор:

select a.diseases_id, a.disease_name 
from diseases a, symtoms b 
where a.diseases_id = b.diseases_id 
and b.symtom_description like '%Cough%' AND b.symtom_description like '%Sore throat%'; 

Теперь проблема в том, что это SQL-запрос ничего не возвращает, но если я удалить И заявление возвращает все болезни, которые содержат «Кашель» в их симптомы, но это не то, что я хочу. Я должен быть в состоянии выбрать кучу симптомов, и если у болезней есть все симптомы, и они совпадают, он вернет болезнь. По запросу, который я опубликовал, он должен вернуться «Гастроэзофагеальный рефлюкс», поскольку это заболевания, которые содержат только кашель и Болезненное горло.

Может ли кто-нибудь дать мне какие-либо указания, как сделать эту работу?

Спасибо!

ответ

2

Нет строки, содержащей «Кашель» И «Болит горло», поэтому, конечно, вы получите пустой результат.

Я хотел бы попробовать что-то вроде этого (непроверенные):

select a.diseases_id, a.disease_name, b.symtom_description 
from diseases a, symtoms b 
where a.diseases_id = b.diseases_id 
and (b.symtom_description like '%Cough%' OR b.symtom_description like '%Sore throat%') 
group by a.diseases_id 
having count(a.diseases_id)=2 
+0

Вы живой заставки! Работает как шарм. Не возражаете ли вы объяснить после группы и как это заставило ее работать? И как работает счет? Какова цель = 2? –

+1

HAVING - это как предложение WHERE для агрегации, поэтому оно применяется ** после ** агрегации (WHERE before). Я использовал дополнительный столбец _b.symtom_description_, чтобы агрегирование дало мне для каждого символа одну строку. С _count (a.diseases_id) = 2_ Я прошу, чтобы _a.diseases_id_ должен существовать 2 раза, так как вы указали 2 симтома в предложении WHERE. Если у вас есть 3 или что-то другое, чем 2, вам необходимо соответствующим образом адаптировать это ограничение. – faulix90

1

Этот запрос может быть написан ниже ANSI совместимый присоединиться заявление

SELECT a.diseases_id, a.disease_name, b.symptom_description 
FROM diseases AS a JOIN symptoms AS b 
    ON a.diseases_id = b.diseases_id 
WHERE b.symptom_description like '%Cough%' OR b.sypmtom_description like '%Sore throat%' 
GROUP BY a.diseases_id 
    HAVING COUNT(a.diseases_id) = 2