MySql 使用 GROUP_CONCAT 的联接中的重复值
MySql duplicated values in a join using GROUP_CONCAT
假设我有这个架构:
_________ _________
| 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 |
|_________|
数据库中有这些信息:
Table 1
_____________
| id_a | name |
|------|------|
| 1 | foo |
|______|______|
Table 2
_____________________
| id_b | info | data |
|------|------|-------|
| 1 | bar | corge |
| 2 | kux | corge |
| 3 | fred | quux |
|______|______|_______|
Table 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 |
|______|______|
link2
_____________
| 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
问题是,当我在一列中有两个或更多相同的值时 (例如 "Table 2" / "data") 结果不会给出相同数量的连接值:
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), 我想知道是否可以直接在请求中获得它们?
所以我自己回答。我要找的是 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
假设我有这个架构:
_________ _________
| 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 |
|_________|
数据库中有这些信息:
Table 1
_____________
| id_a | name |
|------|------|
| 1 | foo |
|______|______|
Table 2
_____________________
| id_b | info | data |
|------|------|-------|
| 1 | bar | corge |
| 2 | kux | corge |
| 3 | fred | quux |
|______|______|_______|
Table 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 |
|______|______|
link2
_____________
| 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
问题是,当我在一列中有两个或更多相同的值时 (例如 "Table 2" / "data") 结果不会给出相同数量的连接值:
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), 我想知道是否可以直接在请求中获得它们?
所以我自己回答。我要找的是 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