Mysql 带有3个表的内部联接(第二个和第三个表“分配”给第一个表-并非全部一起)
我有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
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)
。下次编写请求时,应提供示例数据及其预期结果。我打赌有人会在发布后一分钟给你这个答案:-)