SQL 连接行查询

Posted

技术标签:

【中文标题】SQL 连接行查询【英文标题】:SQL concatenate rows query 【发布时间】:2010-05-21 21:29:44 【问题描述】:

假设我们有一张桌子

帖子 +---------+-----------+--------------- -----+ |邮编 |标题 |状态 |正文 | +---------+-----------+--------------- -----+ | 1 |你好! |已删除 |被删帖! | | 2 |你好2! |已删除 |另一个! | | 3 |新 1 |新 |一个新的! | | 4 |新 2 |新 |又是一个新的! |

我们能否在 SQL 中通过发出单个查询来检索跨行的字段连接,而不必在后端代码中循环连接?

类似

按状态从帖子组中选择标题;

应该给出类似的结果

+---------+---------+ |已删除 |你好!,你好2! | |新 |新1,新2 |

【问题讨论】:

仅在上周就有至少 3 个 GROUP_CONCAT 问题......也许 google 坏了。 好吧,如果我搜索 GROUP_CONCAT,我肯定会找到它;) 【参考方案1】:

如果你使用 mysql 那么你可以使用GROUP_CONCAT:

SELECT status, GROUP_CONCAT(title)
FROM posts
GROUP BY status

【讨论】:

哦,天哪。这正是我想要的。【参考方案2】:

MySQL:

SELECT  status, GROUP_CONCAT(title SEPARATOR ', ')
FROM    posts
GROUP BY
        status

PostgreSQL:

SELECT  status,
        ARRAY_TO_STRING(
        ARRAY(
        SELECT  title
        FROM    posts pi
        WHERE   pi.status = po.status
        ))
FROM    posts po
GROUP BY
        status

【讨论】:

【参考方案3】:

您没有指明特定的 SQL 引擎。

在 Firebird(从 2.1 开始)中,您可以使用 LIST() 函数。看一看:link text

这是一个聚合函数,可以完全满足您的需求。

我猜它存在于其他引擎中(Sybase SQL Anywhere 中的 LIST,MySQL 中的 GROUP_CONCAT)

【讨论】:

以上是关于SQL 连接行查询的主要内容,如果未能解决你的问题,请参考以下文章

数据库(MYSQL)连接查询--sql92等值连接

访问 sql 查询以连接行

复杂的 SQL 连接查询 - 获取最新行

访问sql查询连接匹配有两个匹配的连接行

用于连接等价行的 SQL 查询对列求和

lyt经典版MySQL基础——进阶6:连接查询-sql92语法-内连接