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

我在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语句的过滤,但是查询将返回原始值。我将如何实现?

这是一个 fiddle 供您引用:http://sqlfiddle.com/#!2/d7573/1

谢谢!

编辑(通过戈登):

对于感兴趣的人,此简单版本的查询中会发生此问题:
SELECT GROUP_CONCAT(tag) AS tags
FROM tags
HAVING REPLACE(tags, ' ', '-') is not null;

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

最佳答案

尽管它很有趣,但我认为您应该只填写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,它也会显示正确的结果。

关于mysql - 为什么带有 "HAVING"的 "REPLACE"语句会影响这些值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21782922/

10-12 18:33