为什么带有“REPLACE”的“HAVING”语句会影响这些值?

时间:2014-02-14 15:12:31

标签: mysql sql

我有一个带有“tag”和“category”列的表。标签可能包含空格,但我想通过一个包含破折号而不是空格的查询字符串来过滤它们(它来自一个URL slug)。

我在mysql上运行以下查询:

SELECT GROUP_CONCAT(tag SEPARATOR  ',' ) AS tags
FROM tags 
GROUP BY category 
HAVING REPLACE( tags,  ' ',  '-' ) like "%a%"

结果是:

first-tag,second-tag
third-tag,fourth-tag
fifth-tag

有人可以解释为什么返回的标签也有破折号吗?我希望(并希望)将REPLACE用于HAVING语句的过滤,但查询返回的原始值。我将如何实现这一目标?

这是一个小提琴供您参考:http://sqlfiddle.com/#!2/d7573/1

谢谢!

编辑(由戈登):

对于那些感兴趣的人,在这个更简单的查询版本中会出现此问题:

SELECT GROUP_CONCAT(tag) AS tags
FROM tags 
HAVING REPLACE(tags, ' ', '-') is not null;

正如@Razvan所指出的,这是一个参考问题。直接group_concat()中的having不会发生这种情况。

1 个答案:

答案 0 :(得分:1)

虽然它非常有用,但我认为你应该把一个bug报告填充到MySQL。 它们具有专有扩展,可以修改HAVING的行为 例如:The SQL standard requires that HAVING must reference only columns in the GROUP BY clause or columns used in aggregate functions. However, MySQL supports an extension to this behavior, and permits HAVING to refer to columns in the SELECT list and columns in outer subqueries as well.

既然你的情况不是真实情况(因为你实际上并不需要REPLACE),我认为这值得一提,in case of simple '%%' LIKE patern它不会改变结果。或者,如果您add OR 1 to HAVING clause,它也会显示正确的结果。