表A:
该表中的每个记录都维护给定用户的附加文档列表
表B:
该表中的每个记录代表给定用户的单个附加文档。
我正在尝试获取给定用户的所有表B记录以及表A记录的列表。
其中Table-AsupportingDocIds的varchar列使用需要匹配的逗号分隔来维护Table-B的PrimaryKey idAttachedDocs(INT)的列表。这样我就可以/可以读取对应的表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。也就是说,它被认为是基本的设计缺陷。有时候,出于充分的理由可以忽略大多数标准化级别,但是实际上忽略第一个范式总是不正确的。您应该有一个表,其中每个supportingDocID都有一条记录。 MySQL的独特之处在于它具有
FIND_IN_SET()
之类的功能。大多数RDBMS都没有。