2015-07-20 4 views
1

Как можно в mysql получить строки из второй таблицы (содержимого), которые будут отображаться в виде столбцов в первом (инвентарь)?mysql: выбрать строки из другой таблицы в качестве столбцов

Поскольку идентификатор во второй таблице не является уникальным, 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 может сделать это. нет предела тому, сколько дубликатов идентификатора может иметь место в содержимом таблицы ... требуется каждая строка инвентаря, без дубликатов. было бы очень здорово, если sql может что-то сделать или слияние этих массивов в PHP?

ответ

0

Если есть ограниченное число content строк, связанных с каждой inventory строкой, то вы можете использовать следующий запрос:

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 с «описанием» и «уровень» здесь у вас нет потребности, чтобы обнаружить длину уровня т.е. level1 ,уровень 2. это может вам помочь 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;