【问题标题】:MySql duplicated values in a join using GROUP_CONCAT使用 GROUP_CONCAT 的连接中的 MySql 重复值
【发布时间】:2016-12-21 07:28:43
【问题描述】:

假设我有这个架构:

 _________                               _________
| Table 1 |                             | Table 2 |
|---------|          _______    ________|---------|
| id_a    |___      | link1 |   |       | id_b    |
| name    |   |     |-------|   |       | info    |
|_________|   |_____| id_a  |___|       | data    |
     |              | id_b  |           |_________|
     |              |_______|
     |
     |               _______
     |______________| link2 |_______
                    |-------|       |
                    | id_a  |       |   _________
                    | id_c  |       |__| Table 3 |
                    |_______|          |---------|
                                       | id_c    |
                                       | email   |
                                       |_________|

在数据库中有这些信息:

表 1

 _____________
| id_a | name |
|------|------|
|   1  | foo  |
|______|______|

表 2

 _____________________
| id_b | info | data  |
|------|------|-------|
|   1  | bar  | corge |
|   2  | kux  | corge |
|   3  | fred | quux  |
|______|______|_______|

表 3

 _________________
| id_c | email    |
|------|----------|
|   1  | a@o.com  |
|   2  | b@o.com  |
|   3  | c@o.com  |
|   4  | d@o.com  |
|   5  | e@o.com  |
|______|__________|

链接1

 _____________
| id_a | id_b |
|------|------|
|   1  |   1  |
|   1  |   2  |
|   1  |   3  |
|______|______|

链接2

 _____________
| id_a | id_c |
|------|------|
|   1  |   1  |
|   1  |   2  |
|   1  |   3  |
|   1  |   4  |
|   1  |   5  |
|______|______|

当我尝试检索我想要的数据时,我使用以下语法:

SELECT t1.*,
       GROUP_CONCAT(DISTINCT t2.info SEPARATOR  '|') AS info,
       GROUP_CONCAT(DISTINCT t2.data SEPARATOR  '|') AS data,
       GROUP_CONCAT(DISTINCT t3.email SEPARATOR '|') AS email
FROM table1 AS t1
LEFT JOIN link1 AS l1
ON l1.id_a = t1.id_a
LEFT JOIN table2 AS t2
ON t2.id_b = l1.id_b
LEFT JOIN link2 AS l2
ON l2.id_a = t1.id_a
LEFT JOIN table3 AS t3
ON t3.id_c = l2.id_c
WHERE t1.id_a = ?
GROUP BY t1.id_a

问题是,当我在一列中有两个或多个相同的值时 (例如“表 2”/“数据”),结果不会给出相同数量的连接值:

array(
    'id_a'  => '1',
    'info'  => 'bar|kux|fred',
    'data'  => 'corge|quux',
    'email' => 'a@o.com|b@o.com|c@o.com|d@o.com|e@o.com'
)

由于我需要连接的值是完全相同的数字,以便稍后在我的代码中将它们用作单个输出(例如 Bar Corge、Kux Corge、Fred Quux),我想知道是否有可能按照我在请求中的预期直接获得它们?

【问题讨论】:

    标签: mysql join group-concat


    【解决方案1】:

    所以我自己回答。我要找的是CONCAT_WS。我的要求就变成了

    SELECT t1.*,
           GROUP_CONCAT(DISTINCT CONCAT_WS(
                ' ', t2.info, t2.data
           ) SEPARATOR  ', ') AS info,
           GROUP_CONCAT(DISTINCT t3.email SEPARATOR '|') AS email
    FROM table1 AS t1
    LEFT JOIN link1 AS l1
    ON l1.id_a = t1.id_a
    LEFT JOIN table2 AS t2
    ON t2.id_b = l1.id_b
    LEFT JOIN link2 AS l2
    ON l2.id_a = t1.id_a
    LEFT JOIN table3 AS t3
    ON t3.id_c = l2.id_c
    WHERE t1.id_a = ?
    GROUP BY t1.id_a
    

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 2012-07-14
      • 2015-02-25
      • 2011-06-01
      • 1970-01-01
      • 2017-07-07
      • 2021-08-17
      • 2014-05-22
      • 2016-05-26
      相关资源
      最近更新 更多