MySQL:使用in子句整数左外连接

时间:2015-02-25 21:57:37

标签: mysql string int comma

表-A:
此表中的每条记录都维护给定用户的附加文档列表 Each record in this table maintains the attached documents

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

我正在尝试获取给定用户的所有Table-B记录列表以及Table-A记录。 其中Table-A supportsDocIds varchar列使用需要匹配的逗号分隔来维护Table-B的PrimaryKey idAttachedDocs(INT)列表。所以我想/可以读取匹配记录的相应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

1 个答案:

答案 0 :(得分:0)

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。也就是说,它被认为是一个基本的设计缺陷。有时可以忽略大多数级别的规范化,但是第一种正常形式几乎总是不能忽略。您应该有一个表,每个supportsDocID都有一条记录。 MySQL的独特之处在于它具有FIND_IN_SET()之类的功能。大多数RDBMS都没有。