我有一张这样的表
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 :(得分: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
当他们提到规范化时,我的同事们在评论中谈论的是什么。