首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一行中显示不同的表数据

在一行中显示不同的表数据
EN

Stack Overflow用户
提问于 2017-07-26 17:22:35
回答 2查看 68关注 0票数 0

我有3表:

表1- Staff

代码语言:javascript
运行
复制
------------------------------------
| person_id |   name   | studio_id |
|-----------|----------|-----------|
|     1     |   Bill   |     1     |
|     2     |   Kate   |     1     |
------------------------------------

第二表- Studio

代码语言:javascript
运行
复制
-----------------------------
| studio_id |  studio_name  |
|-----------|---------------|
|     1     |   PeopleProd  |
|     2     |    TheBest    |
-----------------------------

表3- Album

代码语言:javascript
运行
复制
-----------------------------------
| album_id |   Name   | studio_id |
|----------|----------|-----------|
|     1    |   Hits   |     1     |
|     2    |  Goldset |     1     |
-----------------------------------   

我希望将它们显示在一行中,因此结果将是:

代码语言:javascript
运行
复制
------------------------------------------------------
| studio_id | studio_name | person_name | album_name |
|-----------|-------------|-------------|------------|
|     1     |  PeopleProd |     Bill    |     Hits   |
|     1     |  PeopleProd |     Kate    |   GoldSet  |
------------------------------------------------------

但是,当我使用JOIN查询时,我收到的是重复的:

代码语言:javascript
运行
复制
SELECT studio_id studio_name  person_name album_name 
FROM Studio s
JOIN Album a ON s.studio_id = a.studio_id 
JOIN Staff ss ON s.studio_id = ss.studio_id`.

怎么解决这个问题呢?

现在输出

代码语言:javascript
运行
复制
------------------------------------------------------
| studio_id | studio_name | person_name | album_name | 
|-----------|-------------|-------------|------------|
|     1     |  PeopleProd |     Bill    |    Hits    |
|     1     |  PeopleProd |     Kate    |    Hits    |
|     1     |  PeopleProd |     Bill    |   GoldSet  |
|     1     |  PeopleProd |     Kate    |   GoldSet  |
------------------------------------------------------
EN

回答 2

Stack Overflow用户

发布于 2017-07-26 17:35:29

问题是,从技术上讲,您没有得到重复的数据,如果您查看输出,就会发现没有两行是完全相同的。在本例中,由于albumstaff都链接到studio,因此获得所需输出的唯一方法是更改表结构。

解决这个问题的最简单方法是向相册表中添加一个person_id外键,然后将join Staff ss on s.studio_id = ss.studio_id更改为join Staff ss on ss.person_id = a.person_id。这样,您就可以直接将专辑链接到员工,并避免重复问题。

由于您无法修改表结构,所以您唯一的机会(我无论如何都能想到)是使用group by。是的,您将需要调用函数,但是假设相册和工作人员将为每一行加入到同一个工作室,您应该能够逃脱这一问题:

代码语言:javascript
运行
复制
select max(s.studio_id), max(s.studio_name), ss.person_name, a.album_name
from Studio s
join Album a on s.studio_id = a.studio_id
join Staff ss on s.studio_id = ss.studio_id
group by ss.person_name, a.album_name

如果您运行该程序,我很想看到输出,因为很不幸,我现在无法进行测试。如果你不能编辑结构的话,哪一张专辑可能是随机的还是重复的。我建议与负责数据库的人交谈,并解释数据库的结构不正确,并要求他/她修复它。

票数 0
EN

Stack Overflow用户

发布于 2017-07-26 18:10:09

没有什么能说明什么专辑属于什么工作人员,因为专辑只有录音室的外键,而且有2名工作人员与同一个工作室有关系,所以每一张专辑和每个与同一个录音室相关的工作人员都有4个结果是正确的。您的模型是有缺陷的,所以您必须改变它,例如,添加一个关系的工作人员从相册。由于JOIN充当算术×,所以您将始终得到这个结果。如果您想要的只是将它们并排放在一起,请看一看this question

基本上,只需“创建”一个虚拟键并根据该键加入:

代码语言:javascript
运行
复制
select s.studio_id, s.studio_name, ss.person_name, a.album_name
from Studio s left join 
     (select st.*, row_number() over (order by staff_id) as seqnum
      from Staff st
     ) ss on s.studio_id = st.studio_id
     full outer join
     (select al.*, row_number() over (order by album_id) as seqnum
      from Album al
     ) a
     on ss.seqnum = a.seqnum;
where s.studio_id = 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45333659

复制
相关文章

相似问题

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