Согласно комментариям, я придерживаюсь полученного вами запроса и решаю проблемы с отображением в коде приложения.
Но в любом случае, вот стандартный (и не динамический) подход в sql ...
CREATE TABLE media
(id SERIAL PRIMARY KEY
,title VARCHAR(20) NOT NULL
);
INSERT INTO media VALUES
(1,'a song'),
(2,'a video');
DROP TABLE IF EXISTS media_setting;
CREATE TABLE media_setting
(media_id INT NOT NULL
,setting_id INT NOT NULL
,chosen_option INT NOT NULL
,PRIMARY KEY(media_id,setting_id)
);
INSERT INTO media_setting VALUES
(1,1,2),
(1,2,3),
(2,1,1),
(2,2,4);
SELECT m.*
, MAX(CASE WHEN s.setting_id = 1 THEN chosen_option END) option_for_1
, MAX(CASE WHEN s.setting_id = 2 THEN chosen_option END) option_for_2
FROM media m
LEFT
JOIN media_setting s
ON s.media_id = m.id
GROUP
BY m.id;
+----+---------+--------------+--------------+
| id | title | option_for_1 | option_for_2 |
+----+---------+--------------+--------------+
| 1 | a song | 2 | 3 |
| 2 | a video | 1 | 4 |
+----+---------+--------------+--------------+