SQL表

2017-04-14 32 views
0

查找特定的角色,我有一個表像這樣SQL表

d_id | d_name | d_desc | sid 
1  |flu  | .... |4,13,19 

其中SID是VARCHAR。我想要做的是當輸入4或13或19時,它會顯示流感。但是,我的查詢只適用於用戶選擇所有這些值。這裏是我的查詢

SELECT * FROM diseases where sid LIKE '%sid1++%' 

從上面的查詢中,我使用PHP並使用for循環將sid值放入LIKE值中。所以我只是把sid ++簡單化。我的查詢只適用於所有值都存在的情況。如果讓用戶選擇4和19這將是'%4,19%',那麼它什麼都不顯示。謝謝大家。

+0

只是規範化你的模式 – Strawberry

+0

你可以用正則表達式做到這一點,但這通常是一個壞主意。數據庫字段不應包含多個值。參見[第一範式](https://en.wikipedia.org/wiki/First_normal_form)。 –

+0

從長遠來看,最好創建一個新的表,每個'(d_id,sid)'組合都有一行。它也可以通過一個或所有'sid's輕鬆查詢。 –

回答

1

如果你必須做你所要求的,你可以嘗試使用FIND_IN_SET()

SELECT d_id, d_name, d_description 
    FROM diseases 
WHERE FIND_IN_SET(13,sid)<>0 

但此查詢will not be sargable,所以這將是,如果你的表中包含超過幾十行更悍然慢。和ICD10 list of disease codes contains almost 92,000 rows。在完成查找疾病之前,您不希望您的患者死亡或得到好轉。 :-)

所以,你應該創建一個單獨的表。我們稱之爲diseases_sid

它將包含兩列。對於示例的內容將是

d_id sid 
     1  4 
     1 13 
     1 19 

如果你想找到SID從diseases表中的一行,做到這一點。

SELECT d.d_id, d.d_name, d.d_description 
    FROM diseases d 
    JOIN diseases_sid ds ON d.d_id = ds.d_id 
WHERE ds.sid = 13 

這就是我的同事們在評論中提到的正常化時所談論的內容。

+0

嘿謝謝你的回答。其實我已經嘗試了第二種方法,但當用戶只選擇一個sid 4(喉嚨痛)時出錯了,那麼它將顯示所有疾病,包括癌症等慢性疾病。所以我決定改變方法,因爲我不知道如何解決它 –