如何计算逗号分隔列表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