【问题标题】:SQL finding specific character in tableSQL在表中查找特定字符
【发布时间】:2017-04-14 22:26:14
【问题描述】:

我有一张这样的桌子

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%' 那么它什么也不显示。谢谢大家。

【问题讨论】:

  • 规范化你的架构
  • 您可以使用正则表达式来执行此操作,但这通常是个坏主意。数据库字段不应包含多个值。见first normal form
  • 从长远来看,最好为每个(d_id, sid) 组合创建一个包含一行的新表。它还将使通过一个或所有sids 进行查询变得容易。
  • @Strawberry:你知道 OP 现在知道该怎么做了吗? :)
  • @juergen OP 现在知道在 google 中输入什么

标签: php mysql sql-server


【解决方案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 

这就是我的同事在 cmets 中提到标准化时所谈论的内容。

【讨论】:

  • 您好,感谢您的回答。实际上我已经尝试过第二种方法,但它出错了,因为当用户只选择一个 sid 4(喉咙痛)时,它会显示所有疾病,包括癌症等慢性疾病。所以我决定改变方法,因为我不知道如何解决它
猜你喜欢
  • 2016-08-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多