MySQL : Left Outer join with in clause integers

MySQL : Left Outer join with in clause integers

Table-A:
此 table 中的每条记录维护给定用户的附加文档列表

Table-B:
此 table 中的每条记录代表给定用户的单个附加文档。

我正在尝试获取给定用户的所有 Table-B 记录以及 Table-A 记录的列表。 Table-A supportingDocIds varchar 列使用需要匹配的逗号分隔维护 Table-B 的主键 idAttachedDocs(INT) 的列表。这样我 want/can 读取了匹配记录的相应 Table-A 列。

我在下面尝试过,但没有成功。

select a.*,w.month from attacheddocs a left join weeklyhrssummary w on a.idattacheddocs in (REPLACE(w.supportingDocIds, '\'', '')) where a.userId=w.userid and a.userId=138 ;

任何解决方案将不胜感激。谢谢

/高皮
www.AlliBilli.com

WHERE 子句中的

a.userId = w.userid 使其成为隐式内部联接。 a.idattacheddocs IN (REPLACE(w.supportingDocIds, '\'', '')) 等同于 a.idattacheddocs = (REPLACE(w.supportingDocIds, '\'', '') 因为 IN 运算符并不像您想象的那样工作。它认为 '1,2,3' 是单个项目,而不是一组项目。

你可能想要:

SELECT a.*,
    w.month
FROM attacheddocs a
LEFT JOIN weeklyhrssummary w
    ON  a.userId = w.userid
    AND FIND_IN_SET(a.idattacheddocs,REPLACE(w.supportingDocIds, '\'', '')) <> 0
WHERE a.userID = 138;

尽管您实际上可能想要 INNER JOIN

请注意,在关系数据库的单个字段中存储多个项目违反了 first normal form。也就是说,它被认为是一个基本的设计缺陷。有时出于充分的理由可以忽略大多数规范化级别,但第一范式几乎总是不正确,无法忽略。您应该有一个 table,每个 supportingDocID 都有一条记录。 MySQL 的独特之处在于它具有类似 FIND_IN_SET() 的功能。大多数 RDBMS 没有。