2011-11-03 81 views
4

有人知道为什么这是行不通的:MySQL的IN子句

SELECT clients_id FROM clients WHERE 34 IN (clients_groups) 

我存储客户端组ID的文本列“clients_groups”为34,35,42等语句正常工作时,有只是clients_groups中的一个值,否则返回'not found'。

+0

IN条款中的项目必须是离散的。你有什么是一串逗号分隔的值。 – Phil

+2

您应该有一个单独的表格将您的客户端链接到组,而不是使用逗号分隔的值。正常化,人! – Polynomial

+0

看看这个问题:http://stackoverflow.com/questions/4155873/find-in-set-vs-in –

回答

1

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

SELECT clients_id FROM clients WHERE clients_groups LIKE '%34' 

但是这会匹配341等。为什么你有一个值列表?正常形式通常会因此而皱眉。

+0

是的,谢谢。我正在使用%:34:%来避免在寻找解决方案时出现错误。将重新调查另一个表格/标准化,并尝试调整20,000行列表中的联接的速度问题(显示15行左右,但有一个有用的分页栏贯穿全部)。 –

+0

20,000行不应受索引列上的连接影响。 – swasheck

6

你想FIND_IN_SET

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

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

+0

很好的答案。它可能有一个很好的商业用例,但它似乎也会延续/启用“奇怪”的数据库设计。 – swasheck

+0

非常感谢。有关正常化的评论指出。对名单上加入的恐惧放慢了我的工作速度,主要工作流程,产品(很可能是无知)让我感到奇怪的解决办法。 –

+0

@JohnPhelps:奇怪的是,在一个字段中存储多个值会降低应用程序的速度,JOIN超级快。 JOIN可以使用索引;这加快了速度。 –