我遇到以下问题的问题(如果这是一个重复的问题,那么我非常抱歉,但我似乎找不到任何可以帮助我的东西):
SELECT d.*, GROUP_CONCAT(g.name ORDER BY g.name SEPARATOR ", ") AS members
FROM table_d AS d LEFT OUTER JOIN table_g AS g ON (d.eventid = g.id)
WHERE members LIKE '%p%';
MySQL显然无法处理WHERE子句中GROUP_CONCAT列的比较。 所以我的问题非常简单。有没有解决方法,比如使用子查询或类似的东西?我真的需要这段代码才能工作,除了在查询本身中处理它之外,除了处理它之外没有其他任何替代方法。
编辑1:
我不会显示实际代码,因为这可能是保密的,我必须与同行核对。无论如何,我只是编写了这段代码,让你对这个陈述的样子有一个印象,虽然我同意你的说法,但它并没有多大意义。我将在一分钟内检查下面的答案,然后我会回复你。再次获得所有帮助!
编辑2:
尝试使用HAVING
,但只有在我不使用GROUP BY
时才有效。当我尝试它时,它给我一个语法错误,但当我删除GROUP BY
时,查询工作完美。问题是,我需要GROUP BY
否则查询对我来说毫无意义。
编辑3:
好的,所以我犯了一个愚蠢的错误并将HAVING
放在GROUP BY
之前,这显然不起作用。感谢所有帮助,它现在有效!
答案 0 :(得分:14)
使用HAVING
代替WHERE
。
... HAVING members LIKE '%peter%'
WHERE
在评估GROUP_CONCAT
之前应用过滤器; HAVING
稍后会应用它。
编辑:我发现您的查询有点令人困惑。看起来它只会在一个字符串中只包含一行所有名称 - 除非数据库中没有人名为Peter,否则查询将返回任何内容。
也许HAVING
并不是你真正需要的......
答案 1 :(得分:2)
尝试
SELECT ...
...
WHERE g.name = 'peter'
代替。由于您只是进行简单的名称查找,因此无需搜索派生字段 - 只需匹配基础原始字段。
答案 2 :(得分:0)
GROUP_CONCAT
是一个聚合函数。你必须GROUP BY something
。如果您只想要其中包含%peter%
的所有行,请尝试
SELECT d.*, g.name
FROM table_d AS d
LEFT OUTER JOIN table_g AS g
ON (d.eventid = g.id)
WHERE g.name LIKE '%peter%';