Нежелательный результат с двумя "Join" в SQL - PullRequest
0 голосов
/ 01 августа 2020

У меня сейчас проблема с моей базой данных. У меня есть таблица обзоров фильмов, таблица положительных и отрицательных. Эти последние связаны с идентификатором отзыва.

Вот положительные и отрицательные таблицы:

Позитивы таблицы

Табличные негативы

Я бы хотел получить такой результат:

Результат, который хотелось бы

А вот у меня вместо него:

Мой реальный результат

Вот мой SQL код, чтобы получить этот результат:

SELECT positives.libelle AS positive, negatives.libelle AS negative FROM reviews LEFT JOIN positives ON positives.review_id = reviews.id LEFT JOIN negatives ON negatives.review_id = reviews.id WHERE reviews.id = 1 

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Результат, который вы хотите, на самом деле не в реляционном формате - потому что значения столбцов в данной строке действительно не имеют ничего общего друг с другом.

MySQL не поддерживает full join, поэтому я рекомендую union all с row_number() для перечисления строк и group by для их объединения:

SELECT MAX(positive) as positive), MAX(negative) as negative)
FROM ((SELECT p.review_id, p.libelle as positive, NULL as negative,
              ROW_NUMBER() OVER (PARTITION BY p.review_id ORDER BY id) as seqnum
       FROM positives p
       WHERE p.review_id = 1
      ) UNION ALL
      (SELECT n.review_id, NULL, n.libelle,
              ROW_NUMBER() OVER (PARTITION BY n.review_id ORDER BY id) as seqnum
       FROM negatives n
       WHERE n.review_id = 1
      ) 
     ) pn
GROUP BY review_id, id
ORDER BY review_id, id;

Обратите внимание, что это не вернет строк, если нет отзывов (положительных и отрицательных). Вы можете добавить left join, если это действительно важно.

0 голосов
/ 01 августа 2020

Если вам не нужна информация о рецензенте, зачем вам объединять таблицы с рецензентом? просто ограничьте таблицы review_id=1.

Следующий запрос не полностью покрывает ваши потребности, однако может быть полезен для вашей проблемы. Учтите, что Union намного эффективнее, чем Join . Если вы можете использовать Union , избегайте использования Join .

(SELECT positives.libelle AS positive,NULL AS negative FROM positives WHERE review_id=1) 
UNION
(SELECT NULL,negatives.libelle FROM negatives WHERE review_id=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...