簡體   English   中英

如何根據部分匹配加入 MySql?

[英]How to do a Join in MySql based on partial matches?

我有兩張桌子。

表 A

Column 1     Column 2
CT 3C        10.5 -23.12
OT 5A        11.2 -24.5

表 B

Column 1     Column 2
PRIM         12.3 -24.51, 10.5 -23.12, 61.24 -78.23
SEC          8.7345 -46.1934, 10.49 -49.1834
TERT         18.98 -28.12, 11.23 -24.78, 1.45 -24.11, 11.2 -24.5

加入后的結果表:

Column 1      Column 2      Column 3     Column 4
CT 3C         10.5 -23.12   PRIM         12.3 -24.51, 10.5 -23.12, 61.24 -78.23
OT 5A         11.2 -24.5    TERT         18.98 -28.12, 11.23 -24.78, 1.45 -24.11, 11.2 -24.5

有沒有辦法在不將“表 B 中的第 2 列”的內容拆分為單獨的列的情況下進行匹配? '表B第2欄'的內容用','分隔。

10.5 -23.12應該與 12.3 -24.51, 10.5 -23.12 , 61.24 -78.23 匹配,因為它包含在其中存在的值列表中。

我無法將它們拆分為單獨的列,因為在某些情況下,其中有多達 300 個不同的值,由“,”分隔

短期解決方案

使用FIND_IN_SET function

SELECT a.column1, a.column2,
       b.column1, b.column2
  FROM TABLE_A a
  JOIN TABLE_B b ON FIND_IN_SET(a.column2, b.column2) > 0

長期解決方案

非規范化數據僅應在確定有必要之后存儲為性能改進,而不是之前。

您需要 TABLE_A 和 TABLE_B 之間的多對多表來保存逗號分隔列表中表示的關系。

為了給你你想要的東西,試一下下面的查詢。 但是,如果有數萬或數十萬的值,我並不看好它的表現。

select a.col1 as col1, a.col2 as col2, b.col1 as col3, b.col2 as col4
from tableA a
join tableB b
 on (b.col2 like a.col2 + '%' 
      or b.col2 like '%,' + a.col2 + ',%'
      or b.col2 like '%' + a.col2)

三個或條件是值是第一個值、最后一個值或任何中間值。 你不能只說'%' + a.col2 + '%'因為它理論上可以匹配數字集的一部分而不是整個值。 %11.2 -24.5%可以匹配111.2 -24.56

此問題類似, Shakti Singh建議的FIND_IN_SET function 應該適合您。 但是,如果您在單列中有這么多值,我想它會非常慢。

最好是創建一個子表。

300 個不同的值這顯然不是一個字段。 嵌套表,可能是一個更好的名稱。

你這樣做是不對的。 如果單個字段包含大約 300 條記錄,則應將其保留為不同的表。

雖然我同意建議規范化數據庫的答案,但我會指出,如果您沒有與 MySQL 結婚,Postgresql 的數組類型具有 ANY() 謂詞,可以滿足您的要求。 然而,除了哲學問題之外,如果你將這種情況標准化,索引可能也會給你帶來更好的性能。 AFAIK,數組版本不能被有用地索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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