SQL查询 - 在一个结果行中显示连接结果

时间:2018-05-23 15:28:26

标签: php mysql sql database laravel-5

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

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 ...

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

1 个答案:

答案 0 :(得分:1)

看起来你想要的是一个GROUP_CONCAT来组合风险标题和related_estates。

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

一旦你拥有了你的小组功能,我相信由R.id作为Yanet建议分组并且数据应该正确地组合在一起。

如果你确实有更大的数据集,那么MySQL的串联功能就有局限性。因此,在这种情况下,您可能需要按原样返回数据,然后重新格式化以匹配您在PHP端所需的数据。

Group Concat Limit