多对多查询

时间:2010-06-22 07:47:48

标签: sql many-to-many

我有以下数据库结构,

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,依此类推。

谢谢。

3 个答案:

答案 0 :(得分: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

此查询列出了与至少一种症状相匹配的疾病 - 与最多症状相匹配的疾病最重要。

如果您在symptom的{​​{1}} _ id和disease_id添加了唯一约束,则可能会丢失analyze

DISTINCT

答案 1 :(得分: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

答案 2 :(得分:0)

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

将按照匹配症状的降序返回匹配的疾病ID。