Mysql 左连接两个表,以便过滤左表数据,但即使左表数据不存在,也会显示右表数据
为了让我们的客户能够将他们自己的一些数据与我们的数据结构一起存储,我创建了两个额外的表:Mysql 左连接两个表,以便过滤左表数据,但即使左表数据不存在,也会显示右表数据,mysql,Mysql,为了让我们的客户能够将他们自己的一些数据与我们的数据结构一起存储,我创建了两个额外的表: CREATE TABLE external_columns ( `id` INT(11) PRIMARY KEY NOT NULL, `column` VARCHAR(30) NOT NULL, `sid` INT(11) NOT NULL, `bid` INT(11)
CREATE TABLE external_columns
(
`id` INT(11) PRIMARY KEY NOT NULL,
`column` VARCHAR(30) NOT NULL,
`sid` INT(11) NOT NULL,
`bid` INT(11) NOT NULL,
`label` VARCHAR(30) NOT NULL,
`table` VARCHAR(30) NOT NULL,
`default` TINYTEXT NOT NULL
);
CREATE TABLE external_data
(
`id` INT(11) PRIMARY KEY NOT NULL,
`extcol_id` INT(11) NOT NULL,
`sid` INT(11) NOT NULL,
`bid` INT(11) NOT NULL,
`data` MEDIUMTEXT NOT NULL,
`row_id` INT(11) NOT NULL,
CONSTRAINT `external_data_external_columns_id_fk`
FOREIGN KEY (extcol_id) REFERENCES external_columns (id)
);
CREATE UNIQUE INDEX combinedUniqueIndex
ON external_data (extcol_id, sid, bid, row_id);
sid
和bid
是识别数据所属客户的系统值row\u id
是指表中引用的表的主键
为了获取特定行的数据,我创建了以下准备好的语句:
SELECT `data`.*, `columns`.`column`, `columns`.`default`
FROM `external_columns` as `columns`
LEFT JOIN `external_data` as `data`
ON `columns`.`id` = `data`.`extcol_id`
WHERE (
`columns`.`sid` = :sid
AND `columns`.`bid` = :bid
AND `data`.`row_id` = :row_id
AND `columns`.`table` = :tableName
)
只要每个external\u列
的external\u数据
中都有一个给定:row\u id
的条目,这就可以正常工作。但是我想确保每个列总是有一行,即使给定的:row\u id
没有数据。有没有一种方法可以通过一个查询来实现这一点?非常接近,通过将和data.row\u id=:row\u id
放在WHERE中,可以有效地将内部联接写入为null的数据。row\u id
将不匹配
应将此条件向左移动连接条件:
SELECT `data`.*, `columns`.`column`, `columns`.`default`
FROM `external_columns` as `columns`
LEFT JOIN `external_data` as `data`
ON `data`.`extcol_id`= `columns`.id
AND `data`.`row_id` = :row_id
WHERE `columns`.`sid` = :sid
AND `columns`.`bid` = :bid
AND `columns`.`table` = :tableName
个人偏好:
不需要WHERE括号,我总是倾向于将连接的表条件放在连接条件中(如果适用),并将连接表放在LHS上,以使索引选项更加明显
内部联接没有区别,但对于某些左联接是必需的。左外部联接
并将条件从何处
移动到联接?