MySql连接具有不同行号的多个表

时间:2016-08-15 02:36:51

标签: mysql join group-concat

我很抱歉这个可能令人困惑的标题,但我真的不知道如何很好地描述我的问题。 我也为我的英语道歉,因为我不是母语人士。

假设我有这个架构:

 _________                               _________
| Table 1 |                             | Table 2 |
|---------|          ______     ________|---------|
| id_a    |___      | join |   |        | id_b    |
| name    |   |     |------|   |        | info    |
|_________|   |_____| id_a |___|        | data    |
                    | id_b |            |_________|
                    |______|

在数据库中使用这些信息:

表1:

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

表2:

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

加入:

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

在我的数据库中,我有其他表与“Join”类型相同。它们用于存储“表1” ID和来自其他表的其他ID(我在模式中只使用了一个连接表来简化问题)

当我尝试检索我想要的数据时,我首先使用了这种语法:

SELECT t1.*,
       t2.*
FROM table1 AS t1
LEFT JOIN join AS j
ON j.id_a = t1.id_a
LEFT JOIN table2 AS t2
ON t2.id_b = j.id_b
WHERE t1.id_a = ?

但是由于结果是多行的数组而我只期望一行,所以我尝试使用 GROUP_CONCAT

所以我的语法变成了:

SELECT t1.*,
       GROUP_CONCAT(t2.info SEPARATOR '|') AS info,
       GROUP_CONCAT(t2.data SEPARATOR '|') AS data
FROM table1 AS t1
LEFT JOIN join AS j
ON j.id_a = t1.id_a
LEFT JOIN table2 AS t2
ON t2.id_b = j.id_b
WHERE t1.id_a = ?
GROUP BY t1.id_a

现在它工作正常,它返回一行。

现在的问题是我在多个连接中使用这个原则,并且每个连接返回多个与其他连接不同的数字的行。然后重复连接值,我可以得到如下结果:

arrray(
    [...]
    'info' => 'bar|bar|bar|bar|kux|kux|kux|kux|fred|fred|fred|fred|',
    'data' => 'baz|baz|baz|baz|corge|corge|corge|corge|corge|quux|quux|quux|quux'
)

所以我想知道是否有办法避免重复值并仍然在一个请求中检索我想要的数据?

1 个答案:

答案 0 :(得分:1)

根据您的数据,此查询应返回您想要的内容:

SELECT t1.*,
       GROUP_CONCAT(t2.info SEPARATOR '|') AS info,
       GROUP_CONCAT(t2.data SEPARATOR '|') AS data
FROM table1 t1 LEFT JOIN
     join j
     ON j.id_a = t1.id_a LEFT JOIN
     table2 t2
     ON t2.id_b = j.id_b
WHERE t1.id_a = ?
GROUP BY t1.id_a;

如果需要,可以使用DISTINCT删除重复项:

SELECT t1.*,
       GROUP_CONCAT(DISTINCT t2.info SEPARATOR '|') AS info,
       GROUP_CONCAT(DISTINCT t2.data SEPARATOR '|') AS data
FROM table1 t1 LEFT JOIN
     join j
     ON j.id_a = t1.id_a LEFT JOIN
     table2 t2
     ON t2.id_b = j.id_b
WHERE t1.id_a = ?
GROUP BY t1.id_a;

但通常情况下,最好修复查询,使其不生成重复项。