多对多查询

van*_*iko 0 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`)
) ;
Run Code Online (Sandbox Code Playgroud)

编辑: 对不起,我的意思是如何根据输入的症状识别疾病.例如:如果我有症状:发烧和咳嗽那么我会感冒.如果我有症状:喉咙痛和发烧,那么我会感染喉咙.输入是$symptom1,$symptom2,$symptom3,等等.

谢谢.

mar*_*pet 8

SELECT disease_id
FROM analyze
GROUP BY disease_id
HAVING COUNT(symptom_id) > 1
Run Code Online (Sandbox Code Playgroud)

编辑:回复编辑过的问题

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
Run Code Online (Sandbox Code Playgroud)

当然,您必须使用$symptomX各自的ID 替换.

该查询列出了至少与一种症状相匹配的疾病 - 与大多数症状相匹配的疾病位于最顶层.

如果您在symptom_id和disease_idin 上添加了唯一约束analyze,则可能会丢失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
Run Code Online (Sandbox Code Playgroud)