1

我创建了一个简单的 php mysql 系统,可以根据症状诊断疾病。用户可以选择最能描述他/她状况的那些症状。问题是我无法让查询工作。我有以下表格:

  1. m_health_diseases它以独特的 id(即 1、2、3、4 ......)保存疾病。
  2. m_health_symptoms它以其独特的 ID 保存症状。
  3. m_health_relations它根据其他两个表中的主键保存疾病及其症状的关系。

我不允许以新用户的身份发布图片,但我希望您对这些表格有所了解。实际上,这些表类似于此链接帖子:Akhilesh B Chandran 的答案中带有 php-mysql 的症状检查器。

这是 SQL 查询:

SELECT m_health_diseases.DiseaseName 
FROM m_health_relations 
LEFT JOIN m_health_diseases 
  ON m_health_relations.DiseaseId = m_health_diseases.DiseaseId 
WHERE m_health_relations.SymptomId = '14' 
AND m_health_relations.SymptomId = '15' 
AND m_health_relations.SymptomId = '16' 
AND m_health_relations.SymptomId = '4'

上面的查询应该返回疾病:“普通感冒”,但它不返回任何结果集。我尝试以不同的方式更改查询,但仍然没有给我所需的结果。任何帮助将不胜感激。谢谢。

4

3 回答 3

1

再试一次,

由于您的要求是获取所有DiseaseName症状集包括用户提到的所有症状的人,因此我建议您在代码中添加逻辑来处理此问题,但通过 SQL 查询执行此操作的一种方法(尽管未优化)是:

创建表如下:

#tblRel - holds relation between diseases and symptoms
######################################################
relID  | dieaseID | symptomSet
-----------------------------
1         1          1, 2            //Store the symptom set sorted (let symptom set start with a space)
2         2          1, 2, 3

现在,

SELECT diseaseID from tblRel where symptomSet like (" 4,% 14,% 15,% 16"); // Sort input set also

这应该适用于任何数量的症状,但您的代码中需要一些逻辑来对输入集进行排序。

于 2012-06-03T09:01:07.157 回答
1

如果您想要具有所有症状 14、15、16、4 的疾病,您可以为要检查的每个症状加入 m_health_relations 表的另一个副本。

SELECT d.DiseaseName 
FROM m_health_diseases d
INNER JOIN m_health_relations s1 ON (s1.DiseaseId = d.DiseaseId)
INNER JOIN m_health_relations s2 ON (s2.DiseaseId = d.DiseaseId)
INNER JOIN m_health_relations s3 ON (s3.DiseaseId = d.DiseaseId)
INNER JOIN m_health_relations s4 ON (s4.DiseaseId = d.DiseaseId)
WHERE
s1.SymptomId = 14 AND
s2.SymptomId = 15 AND
s3.SymptomId = 16 AND 
s4.SymptomId = 4;

如果您想象没有 where 子句的结果,您会发现每种疾病都有其症状的每种 4 向组合,并且 where 子句选择一个特定的组合(如果存在)。

因为我多次使用同一个表,所以我为每个表使用了表别名,这也使查询更易于阅读。

另外,请注意我使用了 INNER 而不是 LEFT 连接,因为您对任何空结果都不感兴趣。

于 2012-06-03T07:59:42.823 回答
0
WHERE m_health_relations.SymptomId = '14' 
AND m_health_relations.SymptomId = '15' 
AND m_health_relations.SymptomId = '16' 
AND m_health_relations.SymptomId = '4'

m_health_relations.SymptomId 怎么可能同时是 14 和 15 以及 16 和 4?

它应该是ORm_health_relations.SymptomId in (14,15,16,4)

于 2012-06-03T08:03:53.890 回答