mySql IN子句

4

有人知道为什么这个代码不起作用吗:

SELECT clients_id FROM clients WHERE 34 IN (clients_groups)

我在文本列“clients_groups”中存储客户组ID,例如34、35、42等。当“clients_groups”中只有一个值时,语句能正常工作,但如果有多个值,则会返回“未找到”。


IN 子句中的项必须是离散的。而你所拥有的是一个由逗号分隔的单个字符串。 - Phil
2
你应该有一个单独的表格将客户与组链接起来,而不是使用逗号分隔的值。规范化,朋友们! - Polynomial
请查看这个问题:https://dev59.com/r2855IYBdhLWcg3ww3Wa - gen_Eric
2个回答

6
你需要使用FIND_IN_SET函数:
SELECT clients_id
FROM clients
WHERE FIND_IN_SET('34', clients_groups)

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

不错的回答。它可能有一个好的商业用例,但似乎也会使“奇怪”的数据库设计持续存在/变得可行。 - swasheck
非常感谢。注意到有关规范化的评论。由于担心连结列表会减缓我的极快主工作流程,产品(可能是出于无知)已经让我构建一些奇怪的解决方案。 - John Phelps
@JohnPhelps:奇怪的是,在一个字段中存储多个值会减慢您的应用程序,JOIN非常快。 JOIN可以使用索引;这会加速它们的速度。 - gen_Eric

1

这不是IN操作符的使用方式。IN子句接受一个字面值列表进行比较,或者来自子查询的行集。对于您想要的内容,您可以使用LIKE:

SELECT clients_id FROM clients WHERE clients_groups LIKE '%34'

但这将匹配341等。为什么你有一个值列表?通常,正常形式会因为这个原因而不赞成这种做法。


是的,谢谢。我目前正在使用%:34:%来避免在寻找解决方案时出现不匹配的情况。将重新调查另一个表/规范化,并尝试调整连接20,000行列表(显示大约15行,但有一个有用的分页栏,可以浏览整个列表)的速度问题。 - John Phelps
2万行不应该受到索引列连接的影响。 - swasheck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接