簡體   English   中英

MySQL:帶有in子句整數的左外連接

[英]MySQL : Left Outer join with in clause integers

表-A:
此表中的每條記錄都維護給定用戶的附加文檔列表此表中的每條記錄都維護着附加的文檔

表-B:
此表中的每條記錄代表給定用戶的單個附加文檔。表 2

我正在嘗試獲取給定用戶的所有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM