За да завъртите данните в MySQL, ще трябва да използвате както агрегатна функция, така и CASE
израз.
Ако имате известен брой колони, тогава можете да кодирате заявката:
изберете p.postid, max(случай, когато t.tagname ='Incident', след това p.value end) Инцидент, max(случай, когато t.tagname ='Location', след това p.value end) Location, max (случай, когато t.tagname ='Weapon', след което p.value край) Weaponfrom triples pleft join tags t on p.tagid =t.idgroup от p.postid;
Вижте SQL Fiddle с демонстрация
Но ако имате неизвестен брой колони, тогава ще трябва да използвате подготвен израз за генериране на динамичен SQL:
SET @sql =NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(CASE WHEN TagName =''', TagName, ''' THEN p.value END) КАТО `', TagName, '`' ) INTO @sqlFROM тагове;SET @sql =CONCAT('ИЗБЕРЕТЕ p.postid, ', @sql, ' от тройки p леви присъединителни тагове t на p.tagid =t.id група от p.postid');ПРИГОТВЯТЕ stmt ОТ @sql;ИЗПЪЛНЯВАНЕ на stmt;ПРЕКРАТЯВАНЕ НА ПОДГОТОВКА stmt;
Вижте SQL Fiddle с демонстрация .
И двете ще дадат резултат:
<предварителен код>| POSTID | ИНЦИДЕНТ | МЕСТОПОЛОЖЕНИЕ | ОРЪЖИЕ |-------------------------------------------------------| 1 | Убийство | Ню Брънзуик | (нула) || 2 | Кражба | (нула) | Пистолет |