Different column for different conditions when joining
AFAIK the only other way is to run 2 queries and add the columns in the application.

Your solution can work with only one JOIN if you put some IF's in your GROUP_CONCAT's:

`GROUP_CONCAT(IF(a.key = 'format',a.value,NULL))` as formats,
`GROUP_CONCAT(IF(a.key = 'category',a.value,NULL))` as categories,
...


It is debatable if the single JOIN option is better...