gpt4 book ai didi

mysql - LEFT JOIN 两张表,过滤左表数据,即使左表数据不存在,也显示右表数据

转载 作者:行者123 更新时间:2023-11-28 23:37:41 27 4
gpt4 key购买 nike

为了让我们的客户能够将他们自己的一些数据与我们的数据结构一起存储,我创建了两个额外的表:

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);

sidbid 是标识数据所属客户的系统值。 row_id是指table中引用的表的主键。

为了获取特定行的数据,我创建了这个准备好的语句:

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_columnexternal_data 中都有一个给定 :row_id 的条目,这就可以正常工作。但我想确保每个 column 始终有一行,即使给定的 :row_id 没有数据。有没有一种方法可以通过一个查询来做到这一点?

最佳答案

非常接近,通过在您的 WHERE 中放置 AND data.row_id = :row_id,您已经有效地编写了一个 INNER JOIN,因为空的 data.row_id 将不匹配.

您应该将此条件移至 LEFT JOIN 条件:

   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 括号,我总是倾向于将 JOIN 的表条件放在适用的 JOIN 条件中,并将 JOIN 表放在 LHS 上以使索引选项更加明显。

对于 INNER JOIN 没有区别,但对于某些 LEFT JOIN 是必不可少的。

关于mysql - LEFT JOIN 两张表,过滤左表数据,即使左表数据不存在,也显示右表数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35339077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com