Для всего нижеприведенного я использовал эту таблицу:
create table tmp (
id INT auto_increment,
test VARCHAR(255),
PRIMARY KEY (id)
);
insert into tmp (test) values
("a,b"),
("b,c"),
("b,c,a"),
("d")
;
Если возможные значения только a,b,c,d
, вы можете попробовать одно из следующих: Обратите внимание, что это будет работать только в том случае, если вы не очень похожизначения, такие как test
и test_new
, потому что тогда test
будет объединен также со всеми test_new
строками, и количество не будет совпадать
select collection, COUNT(*) as count from tmp JOIN (
select CONCAT("%", tb.collection, "%") as like_collection, collection from (
select "a" COLLATE utf8_general_ci as collection
union select "b" COLLATE utf8_general_ci as collection
union select "c" COLLATE utf8_general_ci as collection
union select "d" COLLATE utf8_general_ci as collection
) tb
) tb1
ON tmp.test LIKE tb1.like_collection
GROUP BY tb1.collection;
, что даст вам желаемый результат
collection | count
a | 2
b | 3
c | 2
d | 1
или вы можете попробовать это
SELECT
(SELECT COUNT(*) FROM tmp WHERE test LIKE '%a%') as a_count,
(SELECT COUNT(*) FROM tmp WHERE test LIKE '%b%') as b_count,
(SELECT COUNT(*) FROM tmp WHERE test LIKE '%c%') as c_count,
(SELECT COUNT(*) FROM tmp WHERE test LIKE '%d%') as d_count
;
Результат будет таким:
a_count | b_count | c_count | d_count
2 | 3 | 2 | 1