Внутреннее объединение с 3 таблицами (вторая и третья «закреплены» за первой - не все вместе) - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть 3 таблицы, которые я хотел бы «внутреннее соединение» - , но всегда к первой таблице !

SELECT *
FROM scene_block AS sb
INNER JOIN roles AS r ON (sb.selected_block = r.id 
                         AND sb.block_type = 'role' 
                         AND r.id NOT IN (21))
INNER JOIN script_actors AS sa ON (sb.selected_block = sa.id 
                                  AND sb.block_type = 'actor')
WHERE 
    sb.scene_id = '1'
GROUP BY
    sb.id
ORDER BY 
    sb.position

Тот же запрос с LEFT JOIN возвращает все результаты, как и ожидалось с r.id 21 «NULL» запрос с INNER JOIN возвращает 0 результатов (так как все внутренние объединения объединены) Result Left Join Но это не то, чего я хочу достичь ...

Я бы хотел добиться того, чтобы в случае scene_block "block_type = 'role" "таблица ролей была внутренне объединена, если block_type =' actor ', script_actors будет внутренне объединена ... и связь между ряды всегда scene_block.selected_id = .id

Таблицы

CREATE TABLE `scene_block` (
  `id` int(11) UNSIGNED NOT NULL,
  `scene_id` int(11) NOT NULL,
  `block_type` enum('actor','role') NOT NULL,
  `selected_block` int(11) DEFAULT NULL,
  `content` text NOT NULL,
  `hideable` enum('0','1') NOT NULL DEFAULT '1',
  `position` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `script_actors` (
  `id` int(11) NOT NULL,
  `script_id` int(11) NOT NULL,
  `realname` varchar(200) NOT NULL,
  `actorname` varchar(200) NOT NULL,
  `description` text NOT NULL,
  `position` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `roles` (
  `id` int(11) UNSIGNED NOT NULL,
  `location_id` int(11) NOT NULL,
  `title` varchar(256) NOT NULL,
  `color` varchar(7) NOT NULL,
  `color_live` varchar(7) NOT NULL,
  `position` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Внутренние объединения здесь не работают, потому что тип блока сцены не может быть одновременно «роль» и «актер». Вам нужны внешние соединения, чтобы получить роль или актера. Затем добавьте условие, чтобы избавиться от блоков сцены, которые не соответствуют друг другу.

SELECT *
FROM scene_block AS sb
LEFT JOIN roles AS r ON sb.selected_block = r.id 
                    AND sb.block_type = 'role' 
                    AND r.id <> 21
LEFT JOIN script_actors AS sa ON sb.selected_block = sa.id 
                             AND sb.block_type = 'actor'
WHERE sb.scene_id = 1
AND (sa.id IS NOT NULL OR r.id IS NOT NULL)
ORDER BY sb.position;
0 голосов
/ 01 февраля 2020

Не проверив его на своих данных, я предполагаю, что вы приблизитесь к желаемому результату, если будете использовать INNER JOIN s вместо LEFT JOIN s.

SELECT *
FROM scene_block AS sb
INNER JOIN roles AS r ON (sb.selected_block = r.id 
                     AND sb.block_type = 'role' 
                     AND r.id NOT IN (21))
INNER JOIN script_actors AS sa ON (sb.selected_block = sa.id 
                                   AND sb.block_type = 'actor')
WHERE 
sb.scene_id = '1'
GROUP BY
sb.id
ORDER BY 
sb.position
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...