2010-06-22 173 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 

编辑:回复编辑的问题

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 

当然,你必须通过他们各自的ID来代替$symptomX

该查询列出了匹配的疾病,至少有一种症状 - 与大多数症状相匹配的疾病最多。

如果您在analyzesymptom _id和disease_id添加了一个唯一约束,你可能会失去的DISTINCT

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(以及group by) – potatopeelings 2010-06-22 08:29:50

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

将递减的匹配症状顺序返回匹配疾病的ID。