SQL Query - 在一个结果行中显示连接结果[重复]

Posted

技术标签:

【中文标题】SQL Query - 在一个结果行中显示连接结果[重复]【英文标题】:SQL Query - display join result in one result row [duplicate] 【发布时间】:2018-11-02 16:05:55 【问题描述】:

我想创建一个基于一个表和其他表的高级搜索 我的桌子:

estate :
    +------+-------------+-------------------+-------------------+
    | id   |     title   |       cat_id      |  date              |
    +------+-------------+-------------------+-------------------+
    |  1   |    test1    |         1         |      1526793203   |
    |  2   |    test2    |         2         |      1526793203   |
    |  3   |    test3    |         3         |      1526793203   |
    +------+--------------+------------------+-------------------+

estate_risk
    +------+-------------+----------------+--------------+
    | id   | estate_id   | title           | consequence |
    +------+-------------+----------------+--------------+
    |  3   |    1        |  risktitle1    | 123          |
    |  4   |    1        |  risktitle2    | 433          |
    |  5   |    1        |  risktitle3    | 523          |
    |  6   |    2        |  risktitle4    | 976          |
    |  7   |    2        |  risktitle5    | 422          |
    |  8   |    3        |  risktitle6    | 124          |
    +------+-------------+----------------+--------------+
related_estate 
    +------+-------------+----------------+--------------+
    | id   | estate_id   | title           | storage      |
    +------+-------------+----------------+--------------+
    |  3   |    1        |  testdata      | 1             |
    |  4   |    1        |  testdata2     | 2             |
    |  5   |    1        |  testdata3     | 3             |
    |  6   |    2        |  testdata4     | 4             |
    |  7   |    2        |  testdata5     | 5             |
    |  8   |    5        |  testdata6     | 6             |
    +------+-------------+----------------+---------------+

还有一些其他的表...(所有表都是 Estate_id) 我想连续获取所有数据,换句话说,我在 Estate_risk 表中有几个相关数据,当我使用连接查询时得到这个结果数据:

示例查询一连接:

SELECT R.id,R.title,C.title,C.storage FROM estate R LEFT JOIN estate_risk as C ON estate_risk .estate_id = R.id

结果:

----------+------------------+----------------+--------------+
   R.id   |      R.title     |   C.title      |  C.consequence  
----------+------------------+----------------+--------------+
    1     |         test1    |   risktitle1   |  123         |
    1     |         test1    |   risktitle2   |  433         |
    1     |         test1    |   risktitle3   |  523         |
    2     |         test2    |   risktitle4   |  976         |
    2     |         test2    |   risktitle5   |  422         |
    3     |         test3    |   risktitle6   |  124         |
----------+------------------+----------------+--------------+

一切都是正确的,但我想要一行中的所有数据,这意味着只有一行 R.id 与一行中的所有 C.title 我的主要目标是将页面搜索结果与所有其他数据表一起显示在一个属性中

+------+-------------+----------------+----------------+
  id   | estate_title| estate_risk    | related_estate |
+------+-------------+----------------+----------------+
  1        test1          risktitle1       testdata1  
                          risktitle2       testdata2      
                          risktitle3       testdata3      
---------------------------------------------------------
2 ...

也许我的目标不正确,但我不知道如何获得这个输出这应该在数据库端还是编程端完成? 在编程方面可以提出什么想法?

【问题讨论】:

在编程方面,您可以按 R.id 进行分组,例如,如果您需要在报告中显示它们 这绝对不是数据库端要做的事情。获取数据库以获取您的记录,并使用您的显示/用户界面以您希望的方式显示数据。另外,我相信您的示例 SQL 语句中的GROUP BY r.id 是个坏主意。 当按 R.id 添加 Group By R.id 时只从 Estate_risk 得到一个结果,例如: risktitle1 但我需要 risktitle1,risktitle2,risktitle3 结果 【参考方案1】:

看起来您想要的是一个 GROUP_CONCAT 来将风险标题和相关状态放在一起。

GROUP_CONCAT(C.title SEPARATOR '\n'),
GROUP_CONCAT(Some_other_column SEPARATOR '\n')

一旦你有了你的分组功能,我相信按照 Yanet 的建议按 R.id 分组,数据应该正确地组合在一起。

但是,如果您确实有更大的数据集,那么 mysql 的连接函数会受到限制。因此,在这种情况下,您可能需要按原样返回数据,然后重新格式化它以匹配 php 端所需的内容。

Group Concat Limit

【讨论】:

非常感谢,我以同样的方式做了同样的事情

以上是关于SQL Query - 在一个结果行中显示连接结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 sql developer 窗口中获取结果行

加入同一个表时 SQL 结果计数发生变化

SAP HANA SQL - 将单个列的多个结果行合并为单个行

SQL:多次重复结果行,并对行进行编号

将一列的多个结果行连接成一个,按另一列分组[重复]

如何将 SQL 查询结果行作为具有不同标题名称的列? [关闭]