不从PHP db查询返回结果集

时间:2012-06-03 07:54:44

标签: php mysql apache

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

  1. m_health_diseases以其独特的ID(即1,2,3,4 ......)来治疗疾病。
  2. m_health_symptoms以其独特的ID显示症状。
  3. m_health_relations根据其他两个表中的主键确定疾病及其症状的关系。
  4. 我不允许以新用户身份发布图片,但我希望您对这些表格有所了解。实际上这些表格类似于这个链接帖子: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'
    

    上面的查询应该返回疾病:'普通感冒',但它不会返回任何结果集。我试过以不同的方式更改查询,但仍然没有给我我需要的结果。任何帮助将受到高度赞赏。感谢。

3 个答案:

答案 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?

应为ORm_health_relations.SymptomId in (14,15,16,4)