MySQL的GROUP_CONCAT在
我有以下查询的问题(如果这是一个重复的问题,那么我很抱歉,但我似乎无法找到任何东西,可以帮助我):MySQL的GROUP_CONCAT在
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:
我不会让实际的代码,因为这可能是机密,我得请与我同行。无论如何,我只是写了这段代码给你一个关于这个陈述看起来如何的印象,尽管我同意你的看法,这并没有多大意义。我将在一分钟内查看下面的答案,然后我会再回复你。再次thnx所有的帮助已经!
编辑2:使用HAVING
尝试过,但只有当我不使用GROUP BY
工作。当我尝试它时,它给我一个语法错误,但是当我删除GROUP BY
时,查询完美地工作。事情是,我需要GROUP BY
,否则查询将对我毫无意义。
编辑3:
好了,我犯了一个愚蠢的错误,并把HAVING
GROUP BY
,这显然是行不通的了。感谢所有帮助,它现在可以工作!
使用HAVING
而不是WHERE
。
... HAVING members LIKE '%peter%'
WHERE
施加GROUP_CONCAT
求值之前的过滤器; HAVING
稍后应用。
编辑:我发现你的查询有点混乱。它看起来只会在单个字符串中获得所有名称的唯一一行 - 除非数据库中没有人名为Peter,否则查询将不会返回任何内容。
也许HAVING
是不是真的,你在这里需要什么...
优秀的答案! – BigFatBaby 2011-03-08 14:16:53
@dnagirl:group_concat在select中已经有一个别名...它是'members',所以@awm是完全正确的。 – BigFatBaby 2011-03-08 14:22:58
你肯定**可以**在一个having子句中使用别名。尝试一下! – awm 2011-03-08 14:30:06
尝试
SELECT ...
...
WHERE g.name = 'peter'
代替。由于您只是进行简单的名称查找,因此无需搜索派生字段 - 只需匹配底层原始字段即可。
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%';
之后,这不完全正确。是的 - 'GROUP_CONCAT'是一个聚合函数,但不是 - 你不需要'GROUP BY'的东西。如果没有给出“GROUP BY”语句,MySQL会将所有结果集合分组到相同的组中,这可能是所期望的效果。 – BigFatBaby 2011-03-08 14:20:55
'g.name like'%peter%''有什么问题? – ajreal 2011-03-08 14:13:17