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

时间:2011-06-08 03:45:20

标签: 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 -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个不同的值,以','分隔

5 个答案:

答案 0 :(得分:7)

短期解决方案

使用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之间需要一个多对多表来保存以逗号分隔的列表中表示的关系。

答案 1 :(得分:2)

为了尝试提供您所要求的内容,请在下方提供一个查询。但是,如果有数十或数十万的值,我对它的表现并不乐观。

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

答案 2 :(得分:1)

this question类似,FIND_IN_SET建议的Shakti Singh功能应该适合您。但是,如果你在一个列中有这么多的值,我想它会非常慢。

最好是创建一个子表。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

虽然我同意建议规范化数据库的答案,但我要指出,如果你没有与MySQL结婚,Postgresql有一个带有ANY()谓词的数组类型可以满足你的需要。但是,除了哲学问题之外,如果你将这种情况标准化,索引也可能会给你带来更好的表现。 AFAIK,无法对阵列版本进行有效索引。