Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 左连接两个表,以便过滤左表数据,但即使左表数据不存在,也会显示右表数据_Mysql - Fatal编程技术网

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上,以使索引选项更加明显


内部联接没有区别,但对于某些左联接是必需的。

左外部联接
并将条件从
何处
移动到联接?