如何在MySql中基于部分匹配进行连接?

如何在MySql中基于部分匹配进行连接?,mysql,sql,Mysql,Sql,我有两张桌子 表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

我有两张桌子

表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个不同的值由“,”分隔。

300个不同的值。这显然不是一个字段。嵌套表可能是更好的名称

你做错了。如果单个字段包含大约300条记录,则应将其作为另一个表保留。

类似于,建议的函数也适用于您。但是,如果在一列中有这么多值,我想速度会非常慢


最好是创建一个子表。

为了满足您的要求,请在下面的查询中添加一个快照。然而,如果有数万或数十万个值,我对其性能并不乐观

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)
这三个or条件是值是第一个值、最后一个值或任何中间值。您不能只说
'%'+a.col2+'%'
,因为理论上它可以匹配数字集的一部分,而不是整个值。i、 e.
%11.2-24.5%
可以匹配
111.2-24.56

短期解决方案 使用:

长期解决方案 非规范化数据仅应在确定有必要后作为性能改进存储--而不是之前的--


在表a和表B之间需要一个多对多表来保存逗号分隔列表中表示的关系。

虽然我同意建议规范化数据库的答案,但我要指出,如果您没有与MySQL结婚,Postgresql有一个数组类型,它带有一个ANY()谓词,可以满足您的需要。然而,除了哲学问题之外,如果你将这种情况正常化,索引可能也会给你带来更好的性能。抱歉,数组版本无法有效地索引

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