Mysql 带有3个表的内部联接(第二个和第三个表“分配”给第一个表-并非全部一起)

Mysql 带有3个表的内部联接(第二个和第三个表“分配”给第一个表-并非全部一起),mysql,sql,inner-join,Mysql,Sql,Inner Join,我有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.s

我有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
具有左连接的同一查询返回所有预期结果,r.id为21“NULL”,具有内部连接的查询返回0个结果(因为所有内部连接都在一起) 但那不是我想要实现的

我想实现的是,如果场景中的block“block\u type='role'”角色表将内部连接,如果block\u type='actor'脚本演员将内部连接。。。行之间的链接也是scene\u block.selected\u 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;

如果使用
内部连接
s而不是
左连接
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

内部连接在这里不起作用,因为场景块类型不能同时是“角色”和“演员”。您需要外部联接来获取角色或参与者。然后添加一个条件以去除不匹配的场景块

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;
选择*
以某人的身份离开现场
在sb上以r的身份左键加入角色。选定的\u块=r.id
和sb.block_type='role'
和r.ID21
左连接脚本\u参与者作为sb上的sa。所选\u块=sa.id
和sb.block_type='actor'
其中sb.scene_id=1
和(sa.id不为NULL或r.id不为NULL)
根据某人的职位命令;

您是否可以显示包含列和值的表,不清楚从哪个表中提取哪个列。您的问题不清楚。请添加一些最小的样本数据和预期结果。如果没有样本数据和结果,很难确定,但我认为您需要将一个
左连接
转换为
内部连接
(或者两者兼而有之)。“空而不是完全没有输出”-这是什么意思?当没有一行要匹配时,是否期望空字符串而不是空值?无论其他两个表中是否有匹配的行,看起来您都包括了
场景块中的所有行。如果其他表中没有匹配的行,则其列的值将为NULL。如果更改为内部联接,则根本不会在结果中获得这些行。如果您更喜欢空字符串,请执行
isnull(我的列名称“”)
谢谢您的回答-我已附上表格并对我的问题进行了解释=)谢谢您的帮助!同意-这就是我在上面写的^^这只是为了得到任何输出。。。我的问题是,内部连接总是在所有表之间连接在一起。。。但是我希望在表1到2和表1到3之间有一个内部联接;)我读过联接的作用,因为我认为您误解了它们的工作方式,说“内部联接总是所有表都在一起”是不准确的。@Charleh我读过!不幸的是,我想不出来。。。有多张桌子,一切都很清楚。。。但在这种特殊情况下,没有三张表……就是这样!!=))太简单了-我找错方向了^^^谢谢!我很高兴这解决了你的问题。如果每个场景块可以有多个演员或角色,则可能需要将
ORDER BY
子句更改为
ORDER BY sb.position,COALESCE(r.position,sa.position)
。下次编写请求时,应提供示例数据及其预期结果。我打赌有人会在发布后一分钟给你这个答案:-)