如何计算逗号分隔列表MySQL中的项目

所以我的问题很简单:

我有一个SQL列这是一个逗号分隔的列表(即cats,dogs,cows, ),我需要计数在其中的项目数使用SQL(所以无论我的function是什么(现在让我们称之为FX)将工作喜欢这个:

  SELECT fx(fooCommaDelimColumn) AS listCount FROM table WHERE id=... 

我知道这是有缺陷的,但你明白了(如果fooCommaDelimColumn的值是cats,dogs,cows, ,那么listCount应该返回4 …)。

就这些。

没有内置函数可以计算string中子string的出现次数,但是可以计算原始string和不带逗号的相同string之间的差异:

 LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn, ',', '')) 

zerkms的解决scheme的工作,毫无疑问。 但是,Steve Wellens指出,你的问题是由不正确的数据库模式造成的。 在一列中不应该有多个值,因为它违反了第一个正常的法则。 相反,你应该至less做两张桌子。 例如,假设你有拥有动物的 成员

 table member (member_id, member_name) table member_animal (member_id, animal_name) 

甚至更好:因为许多用户可以拥有相同types的动物,您应该创build3个表格:

 table member (member_id, member_name) table animal (animal_id, animal_name) table member_animal (member_id, animal_id) 

你可以像这样填充你的表格,例如:

 member (1, 'Tomas') member (2, 'Vincent') animal (1, 'cat') animal (2, 'dog') animal (3, 'turtle') member_animal (1, 1) member_animal (1, 3) member_animal (2, 2) member_animal (2, 3) 

而且,要回答你最初的问题,如果你想知道每个用户有多less动物,那么你会这样做:

 SELECT member_id, COUNT(*) AS num_animals FROM member INNER JOIN member_animal USING (member_id) INNER JOIN animal USING (animal_id) GROUP BY member_id; 

遵循@zerkms的build议。

如果您不知道是否有尾随逗号,请使用TRIMfunction删除任何尾随逗号:

 ( LENGTH(TRIM(BOTH ',' FROM fooCommaDelimColumn)) - LENGTH(REPLACE(TRIM(BOTH ',' FROM fooCommaDelimColumn), ',', '')) + 1 ) as count 

参考: http : //dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim

我也同意重构表格是最好的select,但如果现在不可能的话,这个片段可以完成这项工作。

答案是纠正数据库模式。 这听起来像是一个多对多的关系,需要一个联结表。 http://en.wikipedia.org/wiki/Junction_table

此版本不支持前导或尾随逗号,但支持计数为0的空值:

 IF(values, LENGTH(values) - LENGTH(REPLACE(values, ',', '')) + 1, 0) AS values_count