MySql Group Concat - 不希望从Where子句中排除行

时间:2015-08-17 20:16:36

标签: mysql group-concat

好的,我有一个案例,我想要进行Group Concat,但是在语句中进一步使用Group Concat中的相同列作为Where子句,但不排除导致Group Concat因为Where而导致。得到它了?哈哈,这就是我的意思:

SELECT posts.id, post.post_date, 
  GROUP_CONCAT(DISTINCT terms.name ORDER BY terms.name DESC SEPARATOR ';')
FROM posts
INNER JOIN terms on terms.post_id = posts.id
WHERE terms.name = "kittens";

所以我想得到帖子的term.name =“kittens”的帖子,但帖子可以有多个terms.name,如“小猫”,“猫”,“可爱”等等。所以在集团Concat我希望结果是“小猫;猫;可爱”(每个都是由posts.id相关的单独条目)。但是在Where子句中使用“kittens”时,所有Group Concat返回的都是“kittens”。

如果我说“WHERE terms.name ='kittens'或terms.name ='cats'”,群组Concat将返回“小猫;猫”......但我只想通过一个词来搜索。获得Concat集团的其他条款。

我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:0)

使用Having代替Where。但是你还需要在select子句中加入terms.name,如下所示:

SELECT posts.id, post.post_date, terms.name,
  GROUP_CONCAT(DISTINCT terms.name ORDER BY terms.name DESC SEPARATOR ';')
FROM posts
INNER JOIN terms on terms.post_id = posts.id
HAVING terms.name = "kittens";

答案 1 :(得分:0)

您需要的查询是:

SELECT p.id, p.post_date,
    GROUP_CONCAT(DISTINCT t.name ORDER BY t.name DESC SEPARATOR ';')
FROM posts p
  INNER JOIN terms s ON s.post_id = p.id       # "s" from "search"
  INNER JOIN terms t ON t.post_id = p.id
WHERE s.name = "kittens"                     
GROUP BY p.id

如何运作

如果我正确理解了这个问题,您需要选择帖子中包含术语" kitten"的所有条款。它需要加入表格terms两次:一次获得所有帖子,其中包含“&kit; kittens”#34;并再次以这种方式获得帖子的条款。

这就是查询的作用:它将表格posts别名加入" p" (" p"来自"帖子"),表terms别名为" s" (" s"来自"搜索")并仅选择对(post,term)其中" term"是"小猫"。然后它再次加入表terms作为" t" (" t"来自" term")并匹配具有术语" kittens"的帖子用他们的所有条款。

GROUP BY子句从具有相同posts.id的所有行创建一个组。由于id是表PK的{​​{1}},因此无需将posts添加到posts.post_date子句,GROUP BYfunctionally dependent on p.id }。