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

Tom*_*mas 24 mysql sql

所以我的问题非常简单:

我在SQL中有一个列,它是一个以逗号分隔的列表(即cats,dogs,cows,)我需要使用sql 来计算其中的项目数(因此无论我的函数是什么(现在让我们称之为fx)都会像这样工作:

 SELECT fx(fooCommaDelimColumn) AS listCount FROM table WHERE id=...
Run Code Online (Sandbox Code Playgroud)

我知道那是有缺陷的,但是你明白了(顺便说一句,如果值fooCommaDelimColumncats,dogs,cows,,那么listCount应该返回4 ......).

就这些.

zer*_*kms 51

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

LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn, ',', ''))
Run Code Online (Sandbox Code Playgroud)

  • 实际上你应该在你的答案中添加1,以防列表中只有一个项目:LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn,',',''))+ 1.这个原则仍然值得+1表达. (6认同)
  • 尽管这可行,但可以说,如果 Tomas 正确建模了数据库,他就不会遇到此问题。 (2认同)

Vin*_*ard 6

zerkms的解决方案有效,毫无疑问.但正如Steve Wellens指出的那样,你的问题是由不正确的数据库架构造成的.您不应该在一列中拥有多个值,因为它违反了第一个正常法则.相反,你应该至少制作两个表.例如,假设你有拥有动物的成员:

table member (member_id, member_name)
table member_animal (member_id, animal_name)
Run Code Online (Sandbox Code Playgroud)

更好的是:由于许多用户可以使用相同类型的动物,因此您应该创建3个表:

table member (member_id, member_name)
table animal (animal_id, animal_name)
table member_animal (member_id, animal_id)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

并且,为了回答您的初始问题,如果您想知道每个用户有多少动物,您就会这样做:

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;
Run Code Online (Sandbox Code Playgroud)


小智 5

遵循@zerkms的建议。

如果您不知道是否有尾部逗号,请使用TRIM函数删除任何尾部逗号:

(
    LENGTH(TRIM(BOTH ',' FROM fooCommaDelimColumn))
  - LENGTH(REPLACE(TRIM(BOTH ',' FROM fooCommaDelimColumn), ',', ''))
  + 1
) as count
Run Code Online (Sandbox Code Playgroud)

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

我也同意,重构表是最好的选择,但是如果现在无法做到这一点,那么此片段可以完成工作。