MySQL : Left Outer join with in clause integers

标签 mysql sql

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

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

我正在尝试获取给定用户的所有表 B 记录以及表 A 记录的列表。 其中 Table-A supportDocIds 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

最佳答案

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 。也就是说,它被认为是一个基本的设计缺陷。有时,出于充分的理由,大多数级别的标准化都可以被忽略,但第一范式实际上总是不正确的忽略。您应该有一个表,其中每个支持DocID 都有一条记录。 MySQL 的独特之处在于它有一个类似于 FIND_IN_SET() 的函数。大多数 RDBMS 都没有。

关于MySQL : Left Outer join with in clause integers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28730460/

相关文章:

mysql - 如何在子查询中使用第一个查询的结果

mysql - 查找具有相同列值的行

mysql - MYSQL 中的数组迭代

sql - 如何合并多个 SELECT 结果?

php - 我在哪里可以找到 Xampp 中的数据库凭据?

php - 合并两个准备好的语句不起作用

javascript - 从数据库加载数据,用AJAX发布以更新数据库,返回以加载新数据!完全困惑

php - 在 symfony 中使用 propel 的 WHERE IN 子句

SQL 优化案例 (MSSQL)

mysql - 查询查询中有大量匹配项的大表