Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        4年前关闭。
                                                                                            
                
        
我有一个数据库,其中包含主要症状,其他症状和疾病。我需要替换2个查询,因为我确定我的第一个查询效率不高,而第二个查询根本不正确。我希望任何人都可以帮助我,因为我是这个领域的新手。

数据库说明:

该数据库正在由医疗应用程序使用:


用户选择特定的身体部位
该应用程序列出了该特定身体部位的所有主要症状
用户选择主要症状(常见或较不常见)
该应用程序列出了所选主要症状的所有疾病。用户还会出现2个复选框(其他症状)。列出的疾病顺序(d_weight)取决于年龄,性别,选择的主要症状以及用户检查的框。 d_weight d_weight> 5的疾病被认为较不常见。用户输入的可能性(年龄,性别,身体部位,主要症状)存储在symptom_disease_combi表中。


asa_id是所有适用症状的ID(用户检查的其他症状)
asc_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,以告知用户单击疾病或症状时需要立即去医院
agegenderbodypart是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_apply的ID
asc_id表示adlsymptom_combi的ID
“区别”仅用于一次获得所有症状/疾病。我确定不需要它,但我不知道如何解决它。

最佳答案

抛弃2个症状表,配上一个(症状)和1个相交表(sdc)

我不会在症状上添加新列,例如状态/级别试图抬高症状
对主要或次要的重要性,尽管有诱惑,但因为这很容易
使它不灵活。

例如,晕厥似乎是一种疾病/病状的主要病因,但总体上可能会使它偏斜

出于一般性考虑,因此有1个表用于症状,您正确地在sdc中具有d_weight

我喜欢您的sdc.d_weight概念。

例如,昏厥与癫痫病有关,但对流感没有影响。整个概念
有人给他开了Zarontin而不是Tamiflu时,就搞砸了

因为我喜欢您的sdc.d_weight概念,所以我想知道您为什么选择附加症状表

在表sdc中,您具有名称以“ FK_”开头的键/索引。希望你有实际的FK约束

而不仅仅是命名约定,使您认为自己拥有它们(FK,您没有它们)

例如,针对身体部位,症状和疾病/状况的真实FK。

当用户选择症状时,将其从GUI的功能中删除即可再次添加该症状以进行搜索

通过减少辅助表(我写并建议的第一行),这可以减少工作并简化查询。

再次注意,您对KEY(这是索引的同义词,而不是外键约束)的使用只会创建
索引...

create table symptom
(
    id int not null auto_increment primary key,
    name varchar(100) not null, -- if you can't put a name to it, don't have it
    critical int not null
)ENGINE=MyISAM default charset=latin1;

create table disease
(
    id int not null auto_increment primary key, -- don't mix and match int with int(11)
    name varchar(100) not null, -- if you can't put a name to it, don't have it
    critical int not null,
    -- etc columns, text
)ENGINE=MyISAM default charset=latin1;




create table symptom_disease_combi
(   -- a.k.a. sdc
    id int not null auto_increment primary key, -- don't mix and match int with int(11)
    age int not null,
    gender char(1) not null,    -- int(11) is overkill
    bodypart int not null,
    s_id int not null,
    s_common int not null,
    asc_id int not null,
    asa_id int not null,
    d_id int not null,
    d_weight int not null,

    -- additional indexes (note pk above, so it is there and happy)

    -- note that some of your indexes (your KEYS) are worthless for the queries in question
    -- however they may be useful for other queries in your system
    -- for instance your asc and asa indexes will not be useful as they won't be picked up
    -- in relation to the question posed
    --
    -- you will need to find the proper balance of index bloat based on system needs

    INDEX idx_sdc_siddid (s_id,d_id,bodypart),  -- composite, general purpose
    INDEX idx_sdc_didsid (d_id,s_id,bodypart),  -- ditto but reverse
    INDEX idx_sdc_ascid (asc_id),
    INDEX idx_sdc_asaid (asa_id),
    -- put constraints here:
    CONSTRAINT `fk_sdc_bodypart` FOREIGN KEY (bodypart) REFERENCES bodypart(id),
    CONSTRAINT `fk_sdc_sid` FOREIGN KEY (s_id) REFERENCES symptom(id), -- don't mix and match int and int(11)
    CONSTRAINT `fk_sdc_did` FOREIGN KEY (d_id) REFERENCES disease(id)
    -- are there others, such as asc asa tables ??
)ENGINE=MyISAM default charset=latin1;


我认为您需要认真思考年龄专栏
sdc是否要加载新的一行,对于年龄在50到120岁之间的每一行,对于性别=“ M”的人,对于前列腺癌?
我将此基于您的age = xxxxx行,也许您的意思是> =。还是白血病,您的架构需要一些思考

所以我从下面的查询中排除了年龄

-对于下一个查询,我想知道为什么您需要一个独特的商品?
-给定症状行是否有超过sdc.s_common个?只有你会知道
-如果没有,请抛弃

-您对on子句的连接顺序很重要,使其遵循良好的索引,以便快速返回结果

-我不建议这些是涵盖的索引,但是您将最大限度地减少表扫描活动

select distinct s.name, s.id, sdc.s_common
from symptom s
join symptom_disease_combi sdc
on sdc.s_id=s.id and sdc.bodypart=".$bodypart." and sdc.gender= ".$gender."


-不是我上面关于年龄的评论
-根据需要将权重合并到计算列中

这些是我的建议,祝你好运

关于mysql - MySQL查询以获取所有(其他)症状和疾病,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30824304/

10-12 18:52