[英]MySQL : Left Outer join with in clause integers
表-A:
此表中的每條記錄都維護給定用戶的附加文檔列表
表-B:
此表中的每條記錄代表給定用戶的單個附加文檔。
我正在嘗試獲取給定用戶的所有 Table-B 記錄列表以及 Table-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
。
請注意,在關系數據庫的單個字段中存儲多個項目違反了第一范式。 也就是說,它被認為是一個基本的設計缺陷。 有時可以出於充分的理由忽略大多數規范化級別,但忽略第一范式實際上總是不正確的。 您應該有一個表,其中每個supportingDocID 都有一條記錄。 MySQL 的獨特之處在於它具有類似FIND_IN_SET()
的功能。 大多數 RDBMS 沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.