表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都没有。

10-07 15:01