很抱歉,标题可能很混乱,但我不知道如何很好地描述我的问题。我也赞同我的英语,因为我不是一个母语。
假设我有这样的模式:
_________ _________
| 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 |
|______|______|
在我的数据库中,我有与“联接”表相同类型的其他表。它们用于存储来自其他表的“表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'
)
,所以我想知道是否有一种方法可以避免重复的值,并且仍然在一个请求中检索我想要的数据?。
发布于 2016-08-14 18:42:41
给定您的数据,此查询应该返回所需的内容:
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;
但是,通常情况下,最好是修复查询,这样它就不会生成重复的查询。
https://stackoverflow.com/questions/38948593
复制相似问题