Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 连接两个表并从一列返回多个匹配项的SQL查询?_Mysql_Sql_Join_Subquery_Concat - Fatal编程技术网

Mysql 连接两个表并从一列返回多个匹配项的SQL查询?

Mysql 连接两个表并从一列返回多个匹配项的SQL查询?,mysql,sql,join,subquery,concat,Mysql,Sql,Join,Subquery,Concat,我的标题很糟糕,这可能就是为什么我在谷歌上找不到我想要的东西 我想做的是从一个旧的内部博客中导出一些数据,这样我就可以将它导入其他内容。我的问题是,虽然我可以创建我正在寻找的连接类型,但第二个表中的匹配可能包含多行,因此我最终会得到大量重复数据。我需要从第二个表中获取结果,并将这些结果(如果有多个匹配项)合并到查询结果中的单个字段中。查询不需要WHERE约束,我正在尝试检索整个blog_posts表 希望此表结构的简化布局有助于说明: blog_posts blog_c

我的标题很糟糕,这可能就是为什么我在谷歌上找不到我想要的东西

我想做的是从一个旧的内部博客中导出一些数据,这样我就可以将它导入其他内容。我的问题是,虽然我可以创建我正在寻找的连接类型,但第二个表中的匹配可能包含多行,因此我最终会得到大量重复数据。我需要从第二个表中获取结果,并将这些结果(如果有多个匹配项)合并到查询结果中的单个字段中。查询不需要WHERE约束,我正在尝试检索整个blog_posts表

希望此表结构的简化布局有助于说明:

blog_posts              blog_categories
---------------------------------------
post_id                 post_id
post_content            category_id
post_author
这是一些样本数据

blog_发布表数据:

post_id  post_content  post_author
----------------------------------
1        foo1          bob
2        foo2          bob
3        foo3          fred
post_id  category_id
--------------------
1        1
1        2
1        6
2        1
3        2
3        4
博客类别表数据:

post_id  post_content  post_author
----------------------------------
1        foo1          bob
2        foo2          bob
3        foo3          fred
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表中的匹配项(匹配的每个类别id对应一次)

有没有什么方法可以只用SQL来实现我想要的?我在想某种形式的子选择可能会起作用,但我无法理解它是如何工作的——我知道我基本上想使用当前的post id在我的“循环”中对类别id进行选择,但我不知道它的语法。它不需要是高效的,这是一次性操作。

该功能完全满足您的需要:

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

您想
按blog\u posts.post\u id、blog\u posts.post\u内容、blog\u posts.post\u author进行分组
。然后使用
聚合函数
()从每个组中获取所有
blog\u categories.category\u id
值,并将其转换为单个字符串

您使用的是哪种数据库管理系统?对于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\u TO\u STRING(ARRAY\u AGG(blog\u categories.category\u id),,)
获取逗号分隔的字符串。

仅用于记录,这是MySQL。对不起。不过,从好的方面来看,我使用PostgreSQL的频率比使用MySQL的频率更高,因此我将您的答案添加到了我的本地注释列表中。@BenjaminM是的-这是一个仅使用MySQL的函数,但问题是MySQL,因为我使用了MySQL;)我正在看这个,虽然BLOB输出给了我导出方面的问题,但它似乎起了作用。但我一点也不明白它是如何工作的,尤其是最后的“分组方式”。这些是分类id还是邮寄id?我有大约420个帖子id行和40个分类id行-我希望我的“分组依据”实际上不需要列出其中的每一行。此外,如果我使用
groupbyblog\u posts.post\u id,blog\u posts.post\u内容,blog\u posts.post\u作者在查询结束时,它看起来确实有效。我抽查了一些数据,看起来不错。甚至还添加了另一个联接,这样我就可以从另一个表中提取类别名称。@SQL标准允许按其位置引用分组列,而不是按其扩展。这在我们进行长时间计算时特别方便,但我觉得简洁令人愉悦。我不想使用这种语法,但我接受它。