如何在SQL查询中显示多列中的所有值

时间:2015-07-08 10:48:54

标签: mysql sql mysql-workbench multiple-columns

我试图在数据库中显示来自不同表的一些信息。其中一个表称为job_pieces。在此表中有字段ID,CompanyID和PieceType。每个公司都可以有许多ID和PieceTypes。我不知道每个公司有多少个PieceTypes。这只是一个小例子,但有些公司有近30种PieceTypes。这是一个示例数据库: http://www.sqlfiddle.com/#!9/6d528/2

SELECT  c.Name,
        COUNT(distinct jn.ID) as Jobs
        GROUP_CONCAT(DISTINCT jp.PieceType) as AllPieceTypes,
        jp.PieceType as PieceType        
FROM customer c
LEFT JOIN job_new jn ON c.JobID = jn.ID
LEFT JOIN job_pieces jp ON jn.JobID = jp.JobID
WHERE c.Company_ID = compid
GROUP BY c.ID

此查询的结果是:

enter image description here

我添加了行GROUP_CONCAT,以便您可以看到作业所具有的所有PieceType。 因此,在此查询中,我需要显示公司拥有的所有作业和PieceType。问题在于PieceType列。正如您在第一行的图像中看到的那样,它只显示一种类型,应该有4.我还希望每个PieceType都是一个单独的列,如下所示:

enter image description here

从我所做的搜索来看,将AllPieceTypes列拆分为每个部分的单独列似乎是一件困难的事情。我加入job_pieces表错了吗?为什么只有一种类型存在于PieceType列中?如何在自己的列中显示每个PieceType?他们需要在自己的专栏中,因为每个公司只有一行。所以我需要在显示PieceTypes时继续行

我在这里发现了类似的内容:How to parse a string and create several columns from it? 但我不知道如何为我的查询编辑这个。

1 个答案:

答案 0 :(得分:0)

您可以采取不同的方法。但真正的问题是你需要预先确定有多少这样的类型。 SQL查询返回一组固定的行,这就是group_concat()方便的原因。

以下是一种返回前三种类型的方法的说明:

SELECT  c.Name,
        COUNT(distinct jn.ID) as Jobs
        GROUP_CONCAT(DISTINCT jp.PieceType) as AllPieceTypes,
        substring_index(GROUP_CONCAT(DISTINCT jp.PieceType ORDER BY jp.PiectType), ',', 1) as PieceType1,
        substring_index(substring_index(GROUP_CONCAT(DISTINCT jp.PieceType ORDER BY jp.PiectType), ',', 2), ',', -1) as PieceType2,
        substring_index(substring_index(GROUP_CONCAT(DISTINCT jp.PieceType ORDER BY jp.PiectType), ',', 3), ',', -1) as PieceType3
FROM customer c LEFT JOIN
     job_new jn
     ON c.JobID = jn.ID LEFT JOIN
     job_pieces jp
     ON jn.JobID = jp.JobID
WHERE c.Company_ID = compid
GROUP BY c.ID

(如果某些作业少于3个,那么逻辑会稍微复杂一些,因为这会复制这些值。)