我的头衔太可怕了,这可能就是为什么我找不到我想要的东西。
我要做的是从旧的内部博客中导出一些数据,以便将其导入其他内容。我的问题是虽然我可以创建我正在寻找的那种JOIN,但是第二个表中的匹配可以包含多行,所以我最终会得到大量的重复数据。我需要从第二个表中获取结果,并将这些结果(如果有多个匹配项)连接到查询结果中的单个字段中。查询不需要WHERE约束,我正在尝试检索整个blog_posts表。
希望表格结构的缩写布局有助于说明:
blog_posts blog_categories
---------------------------------------
post_id post_id
post_content category_id
post_author
以下是一些示例数据。
blog_posts表数据:
post_id post_content post_author
----------------------------------
1 foo1 bob
2 foo2 bob
3 foo3 fred
blog_categories表数据:
post_id category_id
--------------------
1 1
1 2
1 6
2 1
3 2
3 4
我理想的结果会是这样的:
post_id post_content post_author category_ids
------------------------------------------------
1 foo1 bob 1,2,6
2 foo2 bob 1
3 foo3 fred 2,4
我能得到的最接近的是这样一个简单的连接:
SELECT
blog_posts.post_id,
blog_posts.post_content,
blog_posts.post_author,
blog_categories.category_id
FROM blog_posts
INNER JOIN blog_categories
ON blog_posts.post_id = blog_categories.post_id
但是多次返回blog_posts表中的匹配项(每个匹配的category_id一次)。
有没有办法用SQL完成我想要的东西?我认为某种子选择会起作用,但是我无法理解它是如何工作的 - 我知道我基本上想要在我的“循环”中为类别ID做一个选择使用当前的帖子ID,但其语法逃脱了我。它不需要高效,这是一次性操作。
答案 0 :(得分:1)
group_concat()
功能正是您所需要的:
SELECT
blog_posts.post_id,
blog_posts.post_content,
blog_posts.post_author,
group_concat(blog_categories.category_id)
FROM blog_posts
JOIN blog_categories ON blog_posts.post_id = blog_categories.post_id
GROUP BY 1, 2, 3
答案 1 :(得分:1)
您想要GROUP BY blog_posts.post_id, blog_posts.post_content, blog_posts.post_author
。然后使用aggregate function
(http://en.wikipedia.org/wiki/Aggregate_function)获取每个组中的所有blog_categories.category_id
值,并将其转换为单个字符串。
您使用的是哪个DBMS?对于Postgres,您可以简单地使用数组作为聚合函数:
SELECT
blog_posts.post_id,
blog_posts.post_content,
blog_posts.post_author,
ARRAY_AGG(blog_categories.category_id)
FROM blog_posts
INNER JOIN blog_categories ON blog_posts.post_id = blog_categories.post_id
GROUP BY
blog_posts.post_id,
blog_posts.post_content,
blog_posts.post_author
或使用ARRAY_TO_STRING(ARRAY_AGG(blog_categories.category_id), ',')
获取以逗号分隔的字符串。