2015-07-10 56 views
0

我有一个查询显示来自数据库中各个表的一些信息。如何将行更改为MySQL中的列

SELECT  
       c.Name, 
       jp.PieceType, 
       jp.Qty 
     FROM customer c 
     LEFT JOIN job_new jn ON c.JobID = jn.ID 
     LEFT JOIN job_pieces jp ON c.JobID = jp.JobID 
     WHERE c.Company_ID = 123 
     GROUP BY c.ID 

我创建了sqlfiddle数据库:http://www.sqlfiddle.com/#!9/13230/8

每个公司可以有很多类型片,但对现在的查询只显示一个类型,即使存在个别问题。在sqlfiddle数据库中,您可以看到公司123有3个PieceTypes。 enter image description here

所以我想显示的块类型为列而不是行。 我想这样的显示在单独列上PieceTypes: enter image description here

回答

4

嘿尝试一下本作表的摆动:SQLFIDDLE

set @sql = null; 
select 
    group_concat(distinct 
    concat(
     'max(case when PieceType = ''', 
     PieceType, 
     ''' then Qty end) AS ', 
     concat(PieceType) 
    ) 
) into @sql 
from customer c 
     LEFT JOIN job_new jn ON c.JobID = jn.ID 
     LEFT JOIN job_pieces jp ON c.JobID = jp.JobID 
     WHERE c.Company_ID = 123; 

set @sql = concat('select c.Name,', @sql, ' FROM customer c 
     LEFT JOIN job_new jn ON c.JobID = jn.ID 
     LEFT JOIN job_pieces jp ON c.JobID = jp.JobID 
     WHERE c.Company_ID = 123 
     GROUP BY c.ID 
'); 

prepare stmt from @sql; 
execute stmt; 
deallocate prepare stmt; 
+0

是的,这是有效的感谢。但为什么LEFT JOIN会在那里连线两次呢? – user123456789

+0

其实你的数据是有条件的,因此这个连接在那里使用 –

0

您可以使用group_concat()

SELECT c.Name, group_concat(jp.PieceType) as piecetypes, 
     group_concat(jp.Qty) as qtys 
FROM customer c LEFT JOIN 
    job_new jn 
    ON c.JobID = jn.ID LEFT JOIN 
    job_pieces jp 
    ON c.JobID = jp.JobID 
WHERE c.Company_ID = 123 
GROUP BY c.ID; 

原始查询有一个很大的禁忌。您有SELECT中的列不在GROUP BY中。 MySQL扩展GROUP BY以允许这种行为。但是,基本上,你不应该使用它。也许有一些很好的用处,当你知道你在做什么真的,但没有其他数据库支持这个扩展。而且,MySQL正在使版本5.7.5中的符合ANSI的GROUP BY

+0

感谢您的答案,但我想PieceTypes是在单独的列,不都聚集在一。我已编辑我的问题,使其更清楚我想要做什么 – user123456789

相关问题