我创建了一个简单的php mysql系统,可根据症状诊断疾病。用户可以选择最能描述他/她病情的症状。问题是我无法让查询工作。我有以下表格:
m_health_diseases
以其独特的ID(即1,2,3,4 ......)来治疗疾病。m_health_symptoms
以其独特的ID显示症状。m_health_relations
根据其他两个表中的主键确定疾病及其症状的关系。我不允许以新用户身份发布图片,但我希望您对这些表格有所了解。实际上这些表格类似于这个链接帖子:Symptom checker with php-mysql在Akhilesh B Chandran的答案中。
这是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'
上面的查询应该返回疾病:'普通感冒',但它不会返回任何结果集。我试过以不同的方式更改查询,但仍然没有给我我需要的结果。任何帮助将受到高度赞赏。感谢。
答案 0 :(得分: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子句的结果,那么每个疾病都会出现症状的每个四向组合,而where子句会选择一个特定的组合(如果存在)。
因为我多次使用同一个表,所以我为每个表使用了表别名,这使得查询也更容易阅读。
另外,请注意我使用的是INNER而不是LEFT join,因为您对任何null结果都不感兴趣。
答案 1 :(得分: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
这适用于任何数量的症状,但代码中需要一些逻辑来对输入集进行排序。
答案 2 :(得分: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?
应为OR
或m_health_relations.SymptomId in (14,15,16,4)