2015-07-20 66 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; 
相關問題