【问题标题】:Getting data from multiple tables into single row while concatenating some values在连接一些值的同时从多个表中获取数据到单行中
【发布时间】:2012-03-30 06:53:14
【问题描述】:

我正在尝试从表中检索数据并将多行合并为一列,而不重复任何信息。

我有以下表格:简介、资格、项目。

简介

pro_id 姓 名
------ -------- ----------
   1 约翰·詹姆斯
   2 弗雷德国王
   3 豪华游艇 Raymond

资质

pro_id 学位学年
------ ------ ------ -----
   1 MBA 沃顿大学 2002
   1 法学学士耶鲁大学 2001
   2 理学士卡文顿大学 1998
   2 BEd 凯洛格大学 1995

项目

pro_id 职称年份
------ ------ ------
   1 社交网络 2003
   1 水生垃圾挖掘 2007
   2 太阳能收音机的设计 1992
   2 专家系统的发展 2011

我想检索每个人的所有信息,每个人在结果中只出现一次。关于资格和项目的信息应该在各自的列中(一列用于资格,另一列用于项目),以逗号分隔。例如,上述样本数据的结果应该是:

1 约翰詹姆斯 MBA 沃顿大学 2002 年,法学学士耶鲁大学 2001 年社交网络 2003 年,水生碎片挖掘 2007 年,太阳能电池板设计 2008 年 2 King Fred BSc Covington University 1998, BEd Kellog University 1995, Msc MIT 2011 Design of solar radios 1992, Development of expert systems 2011 3 雷蒙德豪华游艇

目前,我有一个查询:

SELECT pro_id,
       surname,
       firstname,
       group_concat(degree,school,year) AS qual,
       concat(Title,year) AS work
FROM profile,
       LEFT JOIN qualification
           ON qualification.pro_id = profile.pro_id 
       JOIN projects
           ON projects.pro_id = profile.pro_id 
GROUP BY pro_id

对于示例数据,此查询结果为:

1 John James MBA 沃顿大学 2002 年,社交网络 2003 年 1 John James LLB 耶鲁大学 2001 年,水生碎片挖掘 2007 年 1 约翰·詹姆斯 MBA 沃顿大学 2002 年,社交网络 2003 年,水生碎片挖掘 2007 年 ETC

注意:Raymond Luxury-Yachts 不在当前结果中。

我不想要重复的结果记录。此外,如果姓氏在资格和项目表中没有任何条目,我希望查询返回姓名并在资格和项目表中显示一个空字段,而不是完全省略它们。

【问题讨论】:

  • 正确的sample code(此处为 SQL 语句)比任何即席模式和示例数据格式都更有用。样品请使用CREATE TABLEINSERT ... VALUES。所需的结果不需要以示例代码的形式呈现,因为结果是代码的输出,而不是代码本身。此外,四个空格的缩进是将行标记为代码,而不是用于任意预先格式化的文本。对于后者,您可以使用<pre>

标签: mysql sql database


【解决方案1】:

将 LEFT JOIN 替换为 JOIN

Select pro_id, surname, firstname, group_concat(degree,school,year) as qual,concat(Title,year) as work 
from profile
join qualification on qualification.pro_id = profile.pro_id 
join projects on projects.pro_id = profile.pro_id group by pro_id

What is the difference between "INNER JOIN" and "OUTER JOIN"?

【讨论】:

    【解决方案2】:

    使用 Join 将解决显示值的问题,即使项目表中没有记录。 对于第一个问题,您可以尝试创建一个存储函数并从 select 语句中调用它。该函数将 pro_id 作为参数,创建连接的字符串并返回它。这是我目前唯一能想到的 MySQL 解决方案。

    【讨论】:

      【解决方案3】:

      我认为您对 group_concat 的想法很接近。但是,使用可能的 No 值(因此留下空值)可能会导致问题。我会让每个辅助表都由人的 ID 预先连接并加入该结果。消除空值问题

      SELECT
            p.pro_id,
            p.surname,
            p.firstname,
            PreQConcat.UserQual,
            PrePJConcat.UserWork
         FROM 
            profile p
               LEFT JOIN 
                  ( select q.pro_id,
                           group_concat( q.degree, q.school, q.year) AS UserQual
                       from
                           qualification q
                       group by
                           q.pro_id ) PreQConcat
                  ON p.Pro_ID = PreQConcat.pro_id
      
               LEFT JOIN 
                  ( select pj.pro_id,
                           concat(pj.Title, pj.year) AS UserWork
                       from
                           projects pj
                       group by
                           pj.pro_id ) PrePJConcat
                  ON p.Pro_ID = PrePJConcat.pro_id
      

      无论如何,您正在浏览所有人,并希望将他们各自的所有元素(如果存在)分组,那么为什么要根据不存在的可能性进行分组。让 JOINED 查询每个运行一次,完成一个结果,该结果仅由它拥有数据的人分组,然后加入到原始个人资料人员。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多