1

症状に基づいて病気を診断する単純な php mysql システムを作成しました。ユーザーは、自分の状態を最もよく表している症状を選択できます。問題は、クエリを機能させることができないことです。次のテーブルがあります。

  1. m_health_diseases病気を一意のID(つまり、1、2、3、4、....)で保持します。
  2. m_health_symptoms一意の ID を持つ症状を保持します。
  3. m_health_relationsこれは、他の 2 つのテーブルの主キーに基づいて、病気とその症状の関係を保持します。

新しいユーザーとして画像を投稿することは許可されていませんが、テーブルについてのアイデアをいただければ幸いです. 実際には、表は次のリンク投稿に似ています: 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

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 句は特定の組み合わせ (存在する場合) を選択します。

同じテーブルを何度か使用したため、各テーブルにテーブル エイリアスを使用しました。これにより、クエリも読みやすくなっています。

また、null の結果には関心がないため、LEFT 結合ではなく INNER 結合を使用したことに注意してください。

于 2012-06-03T07:59:42.823 に答える
1

別の試み、

あなたの要件はDiseaseName、症状のセットにユーザーが言及したすべての症状が含まれているすべてのものを取得することであるため、これを処理するためにコードにロジックを追加することをお勧めしますが、(最適化されていませんが) SQL クエリを介してこれを行う 1 つの方法は次のようになります。 :

次のようにテーブルを作成します。

#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 に答える
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)

于 2012-06-03T08:03:53.890 に答える