2015-07-20 60 views
1

是否有可能在mysql中获取第二个表(内容)中的行作为第一个(库存)中的列显示?mysql:从另一个表中选择行作为列

由于第二个表中的ID不是唯一的JOIN会产生重复项,但是我需要第一个表的所有元素作为单个行。

这些都是表: http://sqlfiddle.com/#!9/6da06/1

需要这样一个结果:

id name  location desc1 level1 desc2 level2 desc3 level3 
1 test  somewhere abc 20  def 50  ghi 30 
2 anything something rfg 20  lzb 80  null null 
3 xxyzyzy dffsdfd atc 20  null null null null 

修改表结构是不可能的,那么有没有什么办法的MySQL怎么能做到这一点。对于表格内容中可以出现多少重复的id没有限制......每一行清单都是需要的,没有重复。会非常酷,如果sql可以做些什么,或合并这些数组在PHP中?

回答

0

如果与每个inventory行相关content行的数量有限,那么你可以使用下面的查询:

SELECT i.`id`, i.`name`, i.`location`, 
     MAX(CASE WHEN c.rn = 1 THEN c.`desc` END) AS desc1, 
     MAX(CASE WHEN c.rn = 1 THEN c.`level` END) AS level1, 
     MAX(CASE WHEN c.rn = 2 THEN c.`desc` END) AS desc2, 
     MAX(CASE WHEN c.rn = 2 THEN c.`level` END) AS level2, 
     MAX(CASE WHEN c.rn = 3 THEN c.`desc` END) AS desc3, 
     MAX(CASE WHEN c.rn = 3 THEN c.`level` END) AS level3 
FROM inventory AS i 
LEFT JOIN ( 
    SELECT `id`, `desc`, `level`, 
     @row_number := IF (@id <> id, 
          IF (@id := id, 1, 1), 
          IF (@id := id, @row_number+1, @row_number+1)) AS rn 
    FROM content 
    CROSS JOIN (SELECT @row_number := 0, @id := 0) AS vars 
    ORDER BY `id`, `desc` 
) AS c ON i.`id` = c.`id` 
GROUP BY i.id, i.name, i.location 

以上使用变量增量编号分配给的content行属于相同的id切片。 然后使用条件聚合来关联相关的content行。

Demo here

0

嘿尝试一下本作表的转动就会产生与列名的结果与“说明”和“水平”在这里你的水平CONCAT的价值,你有没有需要检测的水平,即1级长,level2的。这可能会帮助你SQLFIDDLE

set @sql = null; 
set @sql1 = null; 

select 
    group_concat(distinct 
    concat(
     'max(case when c.level = ''', 
     c.level, 
     ''' then c.level end) AS ', 
     concat('level','_',level) 
    ) 
) into @sql 
    from inventory i left join content c on i.id = c.id; 

    select 
    group_concat(distinct 
    concat(
     'max(case when c.level = ''', 
     c.level, 
     ''' then c.desc end) AS ', 
     concat('desc','_',level) 
    ) 
) into @sql1 
    from inventory i left join content c on i.id = c.id; 

set @sql = concat('select i.Name,', @sql, ',',@sql1,' from inventory i left join content c on i.id = c.id group by i.id 
'); 

prepare stmt from @sql; 
execute stmt; 
deallocate prepare stmt; 
相关问题