我试图在数据库中显示来自不同表的一些信息。其中一个表称为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
此查询的结果是:
我添加了行GROUP_CONCAT
,以便您可以看到作业所具有的所有PieceType。
因此,在此查询中,我需要显示公司拥有的所有作业和PieceType。问题在于PieceType列。正如您在第一行的图像中看到的那样,它只显示一种类型,应该有4.我还希望每个PieceType都是一个单独的列,如下所示:
从我所做的搜索来看,将AllPieceTypes列拆分为每个部分的单独列似乎是一件困难的事情。我加入job_pieces表错了吗?为什么只有一种类型存在于PieceType列中?如何在自己的列中显示每个PieceType?他们需要在自己的专栏中,因为每个公司只有一行。所以我需要在显示PieceTypes时继续行
我在这里发现了类似的内容:How to parse a string and create several columns from it? 但我不知道如何为我的查询编辑这个。
答案 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个,那么逻辑会稍微复杂一些,因为这会复制这些值。)