sql函数将具有匹配id的多行返回到一行中

ubbxdtey  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(244)

我目前正在开发一个前端工具,它要求我编写一个查询,将多行数据返回到单个行中。需要注意的是,这个sql查询是根据用户选择动态生成的。我并不擅长解释到底需要做什么,所以让我来告诉你。
表1:

PersonnelID | Product | Intermediate | Advanced
1234          Product1    Module1      Module2
1234          Product2                 Module3
1234          Product3    Module4
123456        Product1    Module1      Module2 
123456        Product2                 Module2

用户可以指定任意数量的产品或模块,查询需要返回带有特定产品和模块的产品或模块。我最初的方法是通过sql来实现这一点,但是现在我更愿意在返回数据时执行一些客户端操作,如果这对我的服务器来说太困难/太多负载的话。
在上述目标多次失败后,我一直在尝试编写一个查询来返回每个特定人员的所有产品条目。例如,1234将返回一行,其中包含产品1、2和3,此外,在“中间”下返回模块1和模块4,在“高级”下返回模块2和3,如下所示:

PersonnelID | Product                       | Intermediate          | Advanced
1234          Product1, Product2, Product3    Module 1, Module 4     Module 2, Module 3
123456        Product1, Product2              Module 1               Module 2, Module 3

我对sql的经验是相当基本的,所以我很抱歉如果这个问题以前被问过或者是一个相当普通的方法,我还不太擅长用sql来表达我的问题或者搜索。
我已经尝试过使用group\u concat(),但是无法按预期工作。它将返回每个产品的每个示例,因为它出现在整个表中,并最终需要大约55秒来执行,这是完全不能接受的。
总的来说,我需要显示谁拥有用户选择的特定产品和/或模块。如果我的方法似乎是倒退/错误的,请让我知道,我不只是想要一个我想学习的答案:)

7jmck4yq

7jmck4yq1#

你要问的问题的答案似乎是:

select PersonnelID,
       group_concat(product),
       group_concat(intermediate),
       group_concat(advanced),
from t
group by PersonnelID;

你应该问另一个关于性能的问题,如果这是一个问题的话。请确保包含有关表大小、索引和正在使用的查询的更多信息。

相关问题