我有一点问题,我想在数组中计算相同的字符串,
例如
我的桌子是这样的:
id | data
---------------------------
1 | @user1,@user2,@user3
2 | @user1,@user4
3 | @user1,@user5
4 | @user2,@user3
我如何计算@ user1,@ user2等。?
答案 0 :(得分:0)
您可以使用find_in_set在逗号分隔的字段中查找数据。
SELECT COUNT(*)
FROM some_table
WHERE FIND_IN_SET('@user2', data)
这将为您提供包含此字符串的行的计数。
请注意,这确实表明数据库设计未规范化,并且由于此函数无法使用与正确规范化的数据库相比可能性能较差的索引(即,将字符串拆分到不同的表中,每个ID每行一行。
编辑 - 如果你想要计算所有字符串: -
SELECT sub1.aString, COUNT(*)
FROM
(
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 1 + units.i + 10 * tens.i), ',', -1) AS aString
FROM some_table,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
) sub1
INNER JOIN some_table
ON FIND_IN_SET(sub1.aString, data)
GROUP BY sub1.aString
这使用几个子查询为主表中的每一行生成100行,每行包含两次数字0到9的组合。从组合中,它可以计算0到99之间的数字(可以轻松扩展以添加另一个子查询,从0到999或更多)。然后,它使用带有生成的数字的SUBSTRING_INDEX来分割每行的数据中可能的字符串。这将产生大量的重复,部分原因是字符串可能会在很多行上,部分原因是每行上的最后一个字符串将被多次输出(即,如果有10个字符串,则最后一个字符串将被输出91由于使用SUBSTRING_INDEX的方式而导致的时间。 DISTINCT用于删除这些重复项。
然后使用FIND_IN_SET将结果连接到您的表,并使用COUNT / GROUP BY获取所有字符串的所有计数。
答案 1 :(得分:0)
您可以尝试这样的事情: -
SELECT COUNT(data)
FROM your_table
WHERE data LIKE '%@user1%'