2016-11-28 59 views
0

我有一个FieldA中的值和FieldB中的另一个值,该值存储在下游函数中用于比较目的。我需要比较,如果FIELDA = FieldB我做与MySQL:使用狮身人面像来比较字段和/或更新

Select TableA T1 
Inner Join TableB T2 
On T1.ID=T2.ID 
and T1.FIeldA=T2.FIeldB 
Set Matched='Y' 

不过,为了确保FIELDA和FieldB是相同的,因为他们来自不同的来源,我需要先例如运行复杂的MySQL标准化更新

Update TableA set Field1 Set Field1=Replace(Field1,'Gato','Cat) where Field1 like '%Gato%

(实际上我用正则表达式,以确保长期是整个单词任何地方,但想保持这个问题简单,以防万一有人觉得有必要指出其中以上可能会失败)。

问题是我有大约2000条款需要更新,所以我必须在两个字段上运行所有2000个查询,并且每次进行比较。

因此,在我看来,一个理想的解决方案就是狮身人面像,我可以用字形或正则表达式,例如

Gato>Cat 
Perro>Dog 

索引表,然后用狮身人面像对它们进行比较,这样GatoCat将匹配。

但是我不能找出一种方法来构建两个字段之间做Match的q sphinxQL查询,更不用说会影响更新的一个。有没有这样的解决方案?

回答

0

在理论上应该能够使用SphinxSE

http://sphinxsearch.com/docs/current/sphinxse-using.html

https://mariadb.com/kb/en/mariadb/sphinx-storage-engine/

这允许您运行狮身人面像查询 '内部' mysql的,因为这样的。因此可以形成一个基于sphinx(sub)查询运行UPDATE的mysql查询(使用子查询)。

如果对表B Sphinx索引(启用词形等),在理论上叫做SphIndexB

UPDATE TableA INNER JOIN SphIndexB 
SET Matched = 'Y' 
WHERE SphIndexB.query = CONCAT('@FIeldB "^',TableA.Field1,'$" ;mode=extended;limit 1') 

...这将是相当缓慢的,因为它运行在每个完整的狮身人面像查询和表A的每一行 - 唯一的好处是它全部发生在Mysql引擎进程中,而不是在应用程序中编码:)

+0

btw,开始说使用子查询,但后来认为可能使用直接连接因为狮身人面像表在右边)。但未经测试,可能仍需要子查询。但是这个概念是一样的。 – barryhunter

+0

我会尝试,过程的缓慢应该通过必须在所有我想要的字段和表上运行标准化来抵消这些表的单个狮身人面像索引。我会回报 – user3649739

+0

我试过,就像在改变一个事物来反映我的表之前我得到了这个'[Err] 1064 - sphinxql:语法错误,意外的IDENT,期望SET或','在'INNER JOIN附近SphIndexB SET Matched ='Y' WHERE SphIndexB.query = CONCAT('@ FIeldB“^',TableA.Field1,'$”; mode = extended; limit 1')'' – user3649739