我正在寻找以下问题的解决方案:
SELECT CASE WHEN p.value LIKE '%foo%' THEN 'foos'
WHEN p.value LIKE '%bar%' THEN 'bars'
WHEN p.value LIKE '%bakar%' THEN 'bakars'
ELSE p.value END as value,
COUNT(*) as count FROM table_a p GROUP BY value
值类似于:
foo, bar, foo and bar, bakar, bakarbar, foobar
此查询的结果是:
value count
foos 3
bars 2
bakars 1
此代码成功计算出现次数,但CASE在第一次匹配时停止。 有没有办法做到这一点?
value count
foos 3
bars 4
bakars 2
答案 0 :(得分:5)
如果您想在每个字符串中计算多于1次,则可以使用UNION
:
SELECT 'foos' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%foo%'
UNION ALL
SELECT 'bars' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%bar%'
UNION ALL
SELECT 'bakars' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%bakar%'
答案 1 :(得分:4)
在单个case
表达式中,由于case
在第一场比赛中停止,因此无法准确达到所需要的效果。
您需要单独的case
表达式或if()
函数调用才能达到预期的结果。如果您不介意将结果放在不同的列中,请使用条件计数:
select count(if(p.value LIKE '%foo%',1,null)) as foos,
...
from table_a p
如果您坚持在同一列中收到计数,请使用union
:
select 'foos' as `value`, count(*) from table_a where table_a.value LIKE '%foo%'
union
...
答案 2 :(得分:3)
select w.word
,count(*)
from table_a
join ( select 'foo' as word
union all select 'bar'
union all select 'bakar'
) w
on value like concat('%',w.word,'%')
group by w.word
;
答案 3 :(得分:1)
试试这个:
SELECT
(select count(p1.value) from table_a p1 where p1.value LIKE '%foo%') as foos,
(select count(p2.value) from table_a p2 where p2.value LIKE '%bar%') as bars,
(select count(p3.value) from table_a p3 where p3.value LIKE '%bakar%') as bakars
FROM table_a p GROUP BY p.value