MySQL:具有in子句整数的左外联接
表A:MySQL:具有in子句整数的左外联接,mysql,string,int,comma,Mysql,String,Int,Comma,表A: 此表中的每条记录维护给定用户的附件列表 表B: 此表中的每条记录表示给定用户的单个附加文档。 我正在尝试获取给定用户的所有表B记录以及表a记录的列表。 其中,Table-A supportingDocIds varchar列使用需要匹配的逗号分隔来维护Table-B的主键idAttachedDocs(INT)列表。因此,我希望/可以读取对应表A列中的匹配记录 我在下面试过,但没有成功 select a.*,w.month from attacheddocs a left join w
此表中的每条记录维护给定用户的附件列表 表B:
此表中的每条记录表示给定用户的单个附加文档。 我正在尝试获取给定用户的所有表B记录以及表a记录的列表。 其中,Table-A supportingDocIds varchar列使用需要匹配的逗号分隔来维护Table-B的主键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 ;
任何解决方案都将不胜感激。谢谢
/Gopiwww.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;
选择一个*,
w、 月
来自Attachedtocs a
左连接每周HRSW摘要
在a.userId=w.userId上
并在集合中查找(a.idattacheddocs,替换(w.SupportingDocId,“\”))0
其中a.userID=138;
尽管您实际上可能需要一个内部联接
请注意,在关系数据库的单个字段中存储多个项会违反规则。也就是说,这被认为是一个基本的设计缺陷。有时,出于充分的理由,大多数规范化级别都可以忽略,但忽略第一个规范化形式实际上总是不正确的。您应该有一个表,其中每个sup都有一条记录portingDocID.MySQL的独特之处在于它有一个类似于
FIND_in_SET()
的函数。大多数RDBMS都没有。简单。请参阅规范化。这与用户无关。没有一条记录是其他表id的逗号分隔列表的问题。我不知道你在说什么。太好了!我明白了。