2010-06-22 2 views
0

나는 다음과 같은 한 데이터베이스 구조는, 편집대다 쿼리

CREATE TABLE IF NOT EXISTS `analyze` (
    `disease_id` int(11) NOT NULL, 
    `symptom_id` int(11) NOT NULL 
) ; 


CREATE TABLE IF NOT EXISTS `disease` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ; 


CREATE TABLE IF NOT EXISTS `symptom` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(4) NOT NULL, 
    PRIMARY KEY (`id`) 
) ; 

: 죄송합니다, 나는 의미는 어떻게 입력 증상 질병을 식별 않습니다. 예 : 증상이있는 경우 : 열이 나고 기침하면 인플루엔자가 생깁니다. 증상이있는 경우 : 인후통과 발열로 인후 감염 될 수 있습니다. 입력은 $symptom1, $symptom2, $symptom3 등입니다.

감사합니다.

답변

8
SELECT disease_id 
FROM analyze 
GROUP BY disease_id 
HAVING COUNT(symptom_id) > 1 

편집 : 편집 된 질문은 해당 ID 년대에 의해 $symptomX를 교체해야합니다 물론

SELECT disease_id, COUNT(DISTINCT symptom_id) 
FROM analyze 
WHERE symptom_id IN ($symptom1, $symptom2, $symptom3) 
GROUP BY disease_id 
ORDER BY COUNT(DISTINCT symptom_id) DESC 

에 댓글을 올리려면.

이 쿼리는 과 일치하는 질병을 적어도 하나의 증상으로 나열합니다. 가장 많은 증상과 일치하는 질병이 맨 위에 있습니다.

당신은 당신이 DISTINCT을 잃을 수, analyzesymptom _id와 disease_id에 고유 제약 조건을 추가 한 경우 :

SELECT disease_id, COUNT(symptom_id) 
FROM analyze 
WHERE symptom_id IN ($symptom1, $symptom2, $symptom3) 
GROUP BY disease_id 
ORDER BY COUNT(symptom_id) DESC 
0
select d.id from disease d inner join analyze a 
    on d.id = a.disease_id 
    group by d.id having count(a.disease_id) > 1 
+0

검색어에 d.name도 추가 할 수 있습니다. – potatopeelings

0
select disease_id, count(*) 
from analyze 
where symptom_id in ($symptom1, $symptom2, $symptom3) 
group by disease_id 
order by 2 descending; 

일치하는 증상의 내림차순으로 일치하는 질병 ID를 반환합니다.