好的,我有一个案例,我想要进行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集团的其他条款。
我怎样才能解决这个问题?
答案 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 BY
为functionally dependent on p.id
}。