1

我的 mysql 数据库中有以下表格。我正在尝试创建一个应用程序,它可以虚拟评估某人是否可能患上食道癌

#tblsymptoms - 包含所有症状
######################################
症状ID | 症状    
-------------------------------------
1 喉咙肿块        
2吞咽困难   
3 最近减肥
4 胃灼热
5 声音嘶哑的咳嗽
6吐血


#tblresponse - 保存所有响应
######################################
响应ID | 回复   
-------------------------------------------------- ---
1 你的症状表明你有问题       
2 您可能患有食管癌  
3 你没有喉癌


#tblrelation - 保持反应和症状之间的关系
######################################
关系ID | 响应ID | 症状ID
-----------------------------------------
1 1 3
2 1 4
3 1 5
4 2 1
5 2 2
6 2 3
7 4 2
8 2 5
9 2 6
10 3 3
11 3 4

我想使用 html 表单中的复选框来查询数据库,这是表单的代码:

<form method="post" action="process.php">
<INPUT TYPE=CHECKBOX NAME="option[]" VALUE="Difficulty in swallowing" id="">Difficulty in swallowing<br>
<INPUT TYPE=CHECKBOX NAME="option[]" VALUE="Difficulty in swallowing" id="">Difficulty in swallowing<br>
<INPUT TYPE=CHECKBOX NAME="option[]" VALUE="Lost weight lately" id="">Lost weight lately<br>
<INPUT TYPE=CHECKBOX NAME="option[]" VALUE="Heartburn" id="">Heartburn<br>
<INPUT TYPE=CHECKBOX NAME="option[]" VALUE="Hoarse-sounding cough" id="">Hoarse-sounding cough<br>
<INPUT TYPE=CHECKBOX NAME="option[]" VALUE="Vomit blood" id="">Vomit blood<br>
<input type="submit" name="formSubmit" value="Diagnose me" />
</form>

现在,以防万一有人选择:Lost weight lately and Heartburn脚本应该从 tblResponse>>>responseID=1 获取数据并显示给用户:Your symptoms suggest you have a problem.

我试过了,但它返回 0 个值

SELECT tblresponse.response
FROM tblrelation 
   LEFT JOIN tblresponse ON tblrelation.responseID = tblresponse.responseID
WHERE tblrelation.symptomID = '3' AND tblrelation.symptomID = '4' 

有人对我应该添加到带有复选框以查询数据库的 html 表单的代码有想法吗?

4

3 回答 3

0

尝试这个:

SELECT response from tblresponse where responseID = (
SELECT responseID from tblrelation 
 where symptomID=4 or symptomID=3
 group by responseID
 having count(*) = 2
)

您还需要传递全部计数(选定值的数量),在这种情况下,我使用 2 等于(选定选项)

演示

编辑:对于 3,4 和 5

SELECT * from tblresponse where responseID = (
SELECT responseID from tblrelation 
 where symptomID=4 or symptomID=3 or symptomID=5
 group by responseID
 having count(*) = 3
)

演示2

于 2013-03-01T15:29:15.117 回答
0

#tblrelation 存在设计问题。

声音嘶哑的咳嗽症状将返回“问题”和“您可能患有食道癌”。

导致特定反应的症状组合需要在一行中才能确定关系是唯一的。

在你做任何其他事情之前解决这个问题,否则你永远不会得到你之后的结果。

您可以像这样创建表:

relationID  | responseID | symptomID
-----------------------------
1         1          3, 4, 5

但这会在检索时产生丑陋的 sql 查询。

如果是我,我想我会将该处理转移到应用程序中。您可以评估哪些框已选中,哪些未选中,并找到适当的响应,而无需将其传递给 sql。

于 2013-03-01T15:19:05.530 回答
0

一列不能有多个值。尝试这个:

SELECT tblresponse.response
FROM tblrelation LEFT JOIN
     tblresponse
      ON tblrelation.responseID = tblresponse.responseID
GROUP BY tblresponse.response
having sum(case when tblrelation.symptomID = '3' then 1 else 0 end) > 0 and
       sum(case when tblrelation.symptomID = '4' then 1 else 0 end) > 0

这会将所有关系组合在一起以获得给定的响应。该having子句计算“3”的数量和“4”的数量。如果它们都大于 0,则返回响应。

顺便说一句,如果 ID 是数字,则不需要引号。

于 2013-03-01T14:45:03.683 回答