【问题标题】:mySql IN clausemySql IN 子句
【发布时间】:2011-11-03 22:00:34
【问题描述】:

任何人都知道为什么这不起作用:

SELECT clients_id FROM clients WHERE 34 IN (clients_groups)

我在文本列“clients_groups”中将客户组 ID 存储为 34、35、42 等。当 clients_groups 中只有一个值时,该语句正常工作,否则返回“未找到”。

【问题讨论】:

  • IN 子句中的项目必须是离散的。你所拥有的是一个逗号分隔值的字符串。
  • 您应该有一个单独的表将您的客户链接到组,而不是使用逗号分隔的值。规范化,人们!

标签: mysql


【解决方案1】:

你想要FIND_IN_SET:

SELECT clients_id
FROM clients
WHERE FIND_IN_SET('34', clients_groups)

我还建议您考虑规范化您的数据库。您可以使用单独的表来存储客户端和组之间的关系。

【讨论】:

  • 好答案。它可能有一个很好的业务用例,但它似乎也使“奇怪”的数据库设计永久化/启用。
  • 非常感谢。注意到关于标准化的评论。害怕加入列表会减慢我快速的主要工作流程,产品已经(很可能是无知)促使我构建奇怪的解决方法。
  • @JohnPhelps:奇怪的是,在一个字段中存储多个值会降低您的应用程序的速度,JOIN 非常快。 JOIN 可以使用索引;这会加快他们的速度。
【解决方案2】:

这不是 IN 的工作方式。 IN 子句接受要比较的文字值列表,或来自子查询的行集。对于你想要的,你可以使用 LIKE:

SELECT clients_id FROM clients WHERE clients_groups LIKE '%34'

但这会匹配 341 等。为什么你有一个值列表?正因如此,普通形式通常对此不屑一顾。

【讨论】:

  • 好的,谢谢。我目前正在使用 %:34:% 来避免在寻找解决方案时出现不匹配。将重新调查另一个表/规范化并尝试调整 20,000 行列表中连接的速度问题(显示 15 行左右,但有一个有用的分页栏贯穿整个区域)。
  • 20,000 行不应受到索引列上的连接的影响。
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2010-12-07
  • 2016-06-08
  • 2014-09-20
  • 2012-07-19
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多