首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySql连接具有不同行号的多个表

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

Stack Overflow用户
提问于 2016-08-15 02:36:50
回答 1查看 79关注 0票数 0

很抱歉,标题可能很混乱,但我不知道如何很好地描述我的问题。我也赞同我的英语,因为我不是一个母语。

假设我有这样的模式:

代码语言:javascript
运行
复制
 _________                               _________
| Table 1 |                             | Table 2 |
|---------|          ______     ________|---------|
| id_a    |___      | join |   |        | id_b    |
| name    |   |     |------|   |        | info    |
|_________|   |_____| id_a |___|        | data    |
                    | id_b |            |_________|
                    |______|

在数据库中提供这些信息:

表1 :

代码语言:javascript
运行
复制
 _____________
| id_a | name |
|------|------|
|   1  | foo  |
|______|______|

表2 :

代码语言:javascript
运行
复制
 _____________________
| id_b | info | data  |
|------|------|-------|
|   1  | bar  | baz   |
|   2  | kux  | corge |
|   3  | fred | quux  |
|______|______|_______|

连接:

代码语言:javascript
运行
复制
 _____________
| id_a | id_b |
|------|------|
|   1  |   1  |
|   1  |   2  |
|   1  |   3  |
|______|______|

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

当我试图检索我想要的数据时,我首先使用了以下语法:

代码语言:javascript
运行
复制
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.。

所以我的语法变成:

代码语言:javascript
运行
复制
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

现在它工作得很好,并且返回一个行。

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

代码语言:javascript
运行
复制
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'
)

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

EN

回答 1

Stack Overflow用户

发布于 2016-08-15 02:42:41

给定您的数据,此查询应该返回所需的内容:

代码语言:javascript
运行
复制
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删除副本。

代码语言:javascript
运行
复制
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;

但是,通常情况下,最好是修复查询,这样它就不会生成重复的查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38948593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档