我有一個包含主要症狀,額外症狀和疾病的數據庫。我需要替換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