我有一个包含主要症状,额外症状和疾病的数据库。我需要替换2个查询,因为我确定我的第一个查询效率不高,而我的第二个查询不是正确的。我希望有人能帮助我,因为我是新来这个领域..MySQL查询获取所有(额外)症状和疾病
数据库解释:
数据库正在使用由医疗应用:
- 用户选择特定的身体部位
- 该应用程序列出了具体的身体部分的所有主要症状
- 用户选择一个主要症状(公共或较少)
该应用程序列出了所选主要症状的所有疾病。还会出现2个复选框(附加症状),可以由用户检查。列出的疾病顺序(d_weight)取决于年龄,性别,选定的主要症状以及用户检查了哪些方框。认为是
d_weight
< = 5的疾病是常见疾病。d_weight
> 5的疾病被认为不太常见。用户输入(年龄,性别,身体部位,主要症状)的可能性存储在symptom_disease_combi表中。asa_id
是应用(即由用户检查addtional症状)asc_id
是的属于特定的主要症状,其他症状所有可能性的ID的所有症状的ID。例如,如果没有选择其他症状,则asc_id
= 0。asc_id
= 1,如果只选择其他症状“失眠”。asc_id
= 2,以防止'失眠'和'爆炸'被选中。
1.查询以获得一个特定的身体部分的所有症状(可以改善):
SELECT DISTINCT s.name
, s.id
, sdc.s_common
FROM symptom as s
, symptom_disease_combi as sdc
WHERE sdc.age = ".$age."
AND sdc.gender = ".$gender."
AND sdc.bodypart = ".$bodypart."
AND sdc.s_id = s.id
2.查询来获取所有的疾病和选择的症状的其它症状(不工作):
SELECT DISTINCT d.name
, d.id
, sdc.d_weight
, adls.id
, adls.name
FROM disease as d
, symptom_disease_combi as sdc
, symptom as s
, adlsymptom as adls
WHERE sdc.age = ".$age."
AND sdc.gender = ".$gender."
AND sdc.bodypart = ".$bodypart."
AND s.id = ".$sid."
AND sdc.s_id = s.id
3。数据库结构(请让我知道,如果我的设计可以提高)
CREATE TABLE symptom
(id INT NOT NULL AUTO INCREMENT
,name VARCHAR(100) DEFAULT NULL
,critical INT NOT NULL
,PRIMARY KEY (id)
) ENGINE=MyISAM;
id name critical
1 Behavioral disturbances 1
2 Ear pressure 0
3 Elevated temperature 0
4 Fainting 0
5 Head pain 0
CREATE TABLE disease (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(100) DEFAULT NULL,
critical int(11) NOT NULL,
description text NOT NULL,
tests text NOT NULL,
treatment text NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=latin1
id name critical description tests treatment
1 Adjustment disorder 0 lorem ipsum lorem ipsum lorem ipsum
2 ADHD 0 lorem ipsum lorem ipsum lorem ipsum
3 Drug reaction 0 lorem ipsum lorem ipsum lorem ipsum
4 Seizure (epilepsy) 1 lorem ipsum lorem ipsum lorem ipsum
CREATE TABLE adlsymptom (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
id name
1 Insomnia
2 Blowing up
3 Depressed
4 Drug abuse
CREATE TABLE adlsymptom_apply (
id int(11) NOT NULL,
as_id int(11) NOT NULL,
PRIMARY KEY (id,as_id),
KEY FK_additional_symptom_that_apply (as_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
id as_id
1 1
1 2
CREATE TABLE adlsymptom_combi (
id int(11) NOT NULL,
as_id int(11) NOT NULL,
PRIMARY KEY (id,as_id),
KEY FK_additional_symptom_combination (as_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
id as_id
1 1
2 2
3 1
3 2
CREATE TABLE symptom_disease_combi (
id int(11) NOT NULL AUTO_INCREMENT,
age int(11) NOT NULL,
gender int(11) NOT NULL,
bodypart int(11) NOT NULL,
s_id int(11) NOT NULL,
s_common int(11) NOT NULL,
asc_id int(11) NOT NULL,
asa_id int(11) NOT NULL,
d_id int(11) NOT NULL,
d_weight int(11) NOT NULL,
PRIMARY KEY (id),
KEY FK_symptom (s_id),
KEY FK_additional_symptom_combination (asc_id),
KEY FK_additional_symptom_that_apply (asa_id),
KEY FK_disease (d_id)
) ENGINE=MyISAM AUTO_INCREMENT=65 DEFAULT CHARSET=latin1
id age gender bodypart s_id s_common asc_id asa_id d_id d_weight
1 1 1 1 1 1 0 1 1 1
2 1 1 1 1 1 0 1 2 2
3 1 1 1 1 1 0 1 3 3
4 1 1 1 1 1 0 1 11 4
更新1:
- 疾病
critical
和病征创建告诉他们需要去用户医院立即当他们点击疾病或症状时 age
,gender
,bodypart
是id的,所以age
= 1,意味着0-5,age
= 2表示6-17,age
= 3表示18-59和age
= 4表示60+。- 请看看应用程序的设计,这将有助于了解数据库的设计:http://i.imgur.com/p9QP1av.png btw,在设计中;导致==疾病...
asa_id
指adlsymptom_applyasc_id
ID referst到adlsymptom_combi- 的 '独特' 的ID是用来获取所有症状/疾病仅仅1次。我相信这不是必需的,但我不知道如何解决它。
那么问题是什么?你在找什么?你有最终产出的样本吗?另外,请用你的表格和一些示例数据创建小提琴 –
请学习使用明确的'join'语法。一个简单的规则:在'from'子句中不要使用逗号。 –
将症状分成两个表的意义如何?这可能会在2张桌子上连续流鼻涕?并且保持第二个交叉表,使联接复杂化,并且降低性能 – AsConfused