Удалить дублирование строк при объединении нескольких таблиц - Mysql - PullRequest
0 голосов
/ 13 марта 2019

СМИ

id  | title   | ...
1   | a song  |
2   | a video |

настройка носителя

media_id  | setting_id  | chosen_option
  1       |    1        |    2
  1       |    2        |    3
  2       |    1        |    1
  2       |    2        |    4

Итак, у меня есть таблица мультимедиа с различной информацией о загруженных пользователем файлах мультимедиа, и у них есть две настройки 1.privacy( option-1 for public and option-2 for private) и 2.age-safty( option-3 is for all and option-4 is for adult only). Теперь, когда пользователь (взрослый) ищет медиа, предположим, что заголовок начинается с a.....

Вот мой запрос:

SELECT 
m.id AS media_id, m.title AS media_title, 
ms.setting_id AS setting, ms.chosen_option as opt 
FROM media m 
LEFT JOIN media_setting ms ON m.id = ms.media_id
WHERE m.title LIKE 'a%'

И это даст мне вывод с дублирующимися строками по одной строке с каждым параметром, который мне не нужен.

Итак, что я хочу:

media_id  |  media_title  | setting_1  | option_for_1 |  setting_2 | option_for_2

1         |  a song       |   1        |    2         |    2        |     3
2         |  a video      |   1        |    1         |    2        |     4

Как мне этого добиться? Спасибо.

1 Ответ

1 голос
/ 13 марта 2019

Согласно комментариям, я придерживаюсь полученного вами запроса и решаю проблемы с отображением в коде приложения.

Но в любом случае, вот стандартный (и не динамический) подход в 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 |
+----+---------+--------------+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...