2013-03-01 20 views
1

我在我的mysql數據庫中有以下表格。我試圖創建一個幾乎可以驢,如果有人可能正在開發食道來自複選框的查詢

 
#tblsymptoms - holds all symptoms 
###################################### 
symptomID | symptom  
------------------------------------- 
1   Mass in the throat   
2   Difficulty in swallowing 
3   Lost weight lately 
4   Heartburn 
5   Hoarse-sounding cough 
6   Vomit blood 


#tblresponse - holds all responses 
###################################### 
responseID | response 
----------------------------------------------------- 
1   Your symptoms suggest you have a problem  
2   You may be having Oesophageal carcinoma 
3   You dont have a throat carcinoma 


#tblrelation - holds relation between response and symptoms 
###################################### 
relationID | responseID | symptomID 
----------------------------- 
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窗體?

回答

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是數字,你不需要報價。

0

#tblrelation有一個設計問題。

聲音嘶啞咳嗽的症狀將同時返回「一個問題」和「您可能患有食管癌」。

導致特定響應的症狀組合需要位於單行上以將關係建立爲唯一。

解決之前,你做任何事情,否則你永遠不會得到你的結果後。

您可以創建表是這樣的:

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

,這將使一個醜陋的SQL查詢,當它來到的時間來恢復。

如果是我,我想我會將該處理移動到應用程序中。您可以評估哪些框被選中,哪些不是,並且可以在不傳遞給sql的情況下找到適當的響應。

+0

感謝...我confused..if你不介意,請郵寄給我的表應該是什麼樣子 – Nick 2013-03-01 15:25:48

+0

如果可以的話,它很可能是更好的在應用程序中處理它,而不是存儲在關係sql – 2013-03-01 15:33:37

+0

好的...讓我試試看...如果你有一個更簡單的方法,我可以做到這一點..你可以在這裏發佈它,如果你不笨,我會真的很感激..再次感謝 – Nick 2013-03-01 15:46:04

0

試試這個:

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

您也需要通過統計所有(選擇值的數量),在這種情況下,我用了2這等於(選定的選項)

DEMO

編輯: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 
) 

DEMO2

+0

Looka at your query再次:症狀ID = 4或症狀ID = 4 ....如果有人選擇了3,4和5 – Nick 2013-03-01 16:01:09

+0

@Nick:沒問題,我糾正了查詢中的拼寫錯誤,並且3,4和5看到這個: [DEMO](http://www.sqlfiddle.com/#!2/d142e5/9)這裏的想法是更新count(*)= 3 – 2013-03-01 16:22:49

+0

您是否嘗試過1,2,3,4,5 ,6 – Nick 2013-03-01 17:00:17