删除 MySQL 中加号后的所有内容

Remove everything after a plus in MySQL

我在MySQL

中有一个查询
select various(functions(here(...))) foo, count(*) ct
from table
group by foo
having ct > 1;

查找重复数据。我想更改查询以从 foo 中删除加号和它们后面的任何内容,这样如果 various(functions(here(...))) 产生 foo+bar 我只得到 foo。 (如果没有出现加号,则保持不变。)

最好的方法是什么?我可以使用 replace

select if(locate("+", various(functions(here(...))))>0, left(various(functions(here(...))), locate("+", various(functions(here(...)))) - 1), various(functions(here(...)))) foo, count(*) ct
from table
where conditions
group by foo
having ct > 1;

但这似乎是 'obviously' 错误的事情。正则表达式会很好,但据我所知 MySQL 中不存在它们。子查询使它稍微不那么笨拙

select if(locate("+", bar)>0, left(bar, locate("+", bar)-1), bar) foo
from table
left join (
  select pkey, various(functions(here(...))) bar
  from table
  where conditions
) subtable using(pkey)
group by foo
having ct > 1
;

但由于 table 很大,我想知道是否有更有效或更易于维护的解决方案。

使用substring_index():

select substring_index(various(functions(here(...))), '+', 1) as foo, count(*) ct
from table
group by foo
having ct > 1;